當前位置:首頁 » 編程軟體 » 編譯原理中傳值和傳名

編譯原理中傳值和傳名

發布時間: 2023-01-19 06:22:59

Ⅰ 參數傳遞的幾種方式 編譯原理

由於web系統採用http協議在瀏覽器和伺服器之間傳輸數據,而http協議是一種無狀態的協議,如何在不同頁面之間傳遞數據,可以有一下幾種方式
方式一:表單方式傳遞
表單傳遞參數是一種最簡單,也是最基本的參數傳遞方式。注意:表單元素隱藏按鈕的使用
方式二:帶參數的url方式傳遞
帶參數的url寫法: url?參數名1=值1&參數名2=值2。
方式三:請求request對象
可以將數據綁定到request對象上,通過request對象getAttribute和setAttribute方法讀寫
方式四:用戶會話session對象
可以將數據綁定到session對象上,通過session對象getAttribute和setAttribute方法讀寫
方式五:application對象
可以將數據綁定到application對象上,通過application對象getAttibute方法和setAttribute方法讀寫
方式六:cookie對象
可以將數據寫到到客戶端瀏覽器cookie文件中。

其中方式一,方式二隻能實現字元串參數的傳遞,方式三,四,五,六可以實現對象的傳遞(方式六需要對象序列化後進行存儲
方式一,方式二,方式三數據傳遞只能請求頁面獲取數據,而方式四,五,六可以在多個不同頁面獲取數據對象
方式四和六保存的數據對象都是和某個用戶相關的信息,不同的是方式四將數據保存到伺服器內存中,方式六將數據保存到客戶端內存中。
方式五保存的數據對象都是和所有用戶相關的信息,數據也是保存到伺服器內存中。

Ⅱ 編譯原理傳地址問題

傳址的話,這么講你應該更明白,因為y(A):=x+y(1),y(1)=x+y(2),這時的y(2)才等於A,所以y:=x+x+y

Ⅲ 在c語言編程中,傳值方式和傳引用方式之間有什麼區別

在C語言中,並沒有引用的概念,這個是C++的概念。
在C++的函數參數中,有兩種形式,其中
TYPE
&
var的形式,稱為傳引用方式;
TYPE
var的形式,稱為傳值。
二者的區別為,當傳引用時,實際傳到函數中的形參,是實際參數的一個引用,而不是僅傳遞值到函數中。具體的表現有以下幾條:
1
傳引用時,形參和實參是同一個變數,即使用相同的內存空間,二者有相同的地址。而傳值時二者地址不同;
2
傳引用時,由於沒有新建變數,所以對於類對象參數,不會產生構造和析構。而如果是傳值調用,調用時會進行構造,退出函數時會進行析構;
3
由於傳引用使用的是原本實參的地址,所以對引用參數值的修改,會在退出函數後體現在主調函數中,而傳值調用對參數的修改不會影響到主調函數。

php中傳值與傳引用的區別

傳值要重新構造一份原參數的拷貝
傳引用則不需要

傳值對參數的修改不會改變原參數
傳引用時可以直接修改原參數

至於什麼時候傳引用,這看你的需要。
如果你的參數對象比較大(佔用內存很多),而函數本身不需要修改原對象時,這個時候就推薦傳引用,可以省去臨時對象的構造開銷。
如果你有實際修改原參數的需要,那麼就只能傳引用了。

Ⅳ 在c語言編程中,傳值方式和傳引用方式之間有什麼區別

傳值方式:
當一個函數是傳值方式的時候,你調用這個函數的時候傳入的實參的值會被拷貝到形參,
但是形參與實參之間並沒有什麼聯系,比如變數b=5,a=b;這個時候將b賦值給a,他們的值相等,但是當這以後無論a的值怎麼改變都不會影響到b,b=5,a=b;a=1;這時候b依然是5,這就是傳值方式
#include<stdio.h>
void add(int a,int b)
{
a=a+b;//改變了形參a的值
return a;
}
void main()
{
int a=1,b=2;
printf("%d\n",add(a,b));//3
printf("%d\n",a);//1
printf("%d\n",b);//2
}
傳引用方式:
當你調用一個函數時,傳入的是實參的地址的時候,這時候修改形參,實參也會受到影響,不過這種傳地址某種意義是傳值,首先將實參的地址拷貝到形參,他們兩個以後就沒有關系了,你也可以改變形參保存的地址,實參的地址不會改變,但是你操作的是形參對應地址的內容,與實參對應地址的內容一致,操作是同一個對象,所以形參對這個地址的操作,在實參那裡也會看到效果
#include<stdio.h>
void add(int *a,int *b)
{
*a=*a+*b;//改變了形參a的值
return *a;
}
void main()
{
int a=1,b=2;
printf("%d\n",add(&a,&b));//3
printf("%d\n",a);//3
printf("%d\n",b);//2
}

Ⅵ C++關於函數的傳值和傳地址傳引用的區別

你好,
函數傳值,只是起到一個「傳」的作用,在調用函數中修改,只會在調用函數的這個作用域中起作用。

函數傳地址,一般通過傳指針或傳引用。它在調用函數的時候,如果改變了傳入地址中的數據,即地址所指向的地址空間。

而通過傳值,相當於在內存中拷貝了一份,在調用函數中,只改變了拷貝值所在的地址空間的數據,而不是改變所傳入值的地址空間的數據

a1和a2都是運行了,只是a2運行的並沒有改變傳入的值!

如果需要還不懂,可以再來問我!

Ⅶ 編譯原理問題,高手進。

回答下列問題:(30分)
(6分)對於下面程序段
program test (input, output)
var i, j: integer;
procere CAL(x, y: integer);
begin
y:=y*y; x:=x-y; y:=y-x
end;
begin
i:=2; j:=3; CAL(i, j)
writeln(j)
end.
若參數傳遞的方法分別為(1)傳值、(2)傳地址,(3)傳名,請寫出程序執行的輸出結果。
答: (1) 3 (2) 16 (3) 16 (每個值2分)

(6分)計算文法G(M)的每個非終結符的FIRST和FOLLOW集合,並判斷該文法是否是LL(1)的,請說明理由。
G(M):
M → TB
T → Ba |
B → Db | eT |
D → d |

解答:
計算文法的FIRST和FOLLOW集合:(4分)
FIRST(M) = { a,b,e,d, } FIRST(T) = { a,b,e,d, }
FIRST(B) = {b,e,d, } FIRST(D) = {d,}
FOLLOW (M) = {#} FOLLOW (T) = { a,b,e,d,#}
FOLLOW (B) = {a,# } FOLLOW (D) = { b}

檢查文法的所有產生式,我們可以得到:
1. 該文法不含左遞歸,
2. 該文法中每一個非終結符M,T,B,D的各個產生式的候選首符集兩兩不相交。
3. 該文法的非終結符T、B和D,它們都有候選式,而且
FIRST(T)∩FOLLOW(T)={ a,b,e,d }≠
所以該文法不是LL(1)文法。(2分)

(4分)考慮下面的屬性文法
產 生 式 語 義 規 則
S→ABC

A→a
B→b
C→c B.u := S.u
A.u := B.v + C.v
S.v := A.v
A.v :=3*A.u
B.v := B.u
C.v := 1
畫出字元串abc的語法樹;
對於該語法樹,假設S.u的初始值為5,屬性計算完成後,S.v的值為多少。
答:(1) (2分)

(2) S.v的值為18 (2分)

(4分)運行時的DISPLAY表的內容是什麼?它的作用是什麼?
答:DISPLAY表是嵌套層次顯示表。每當進入一個過程後,在建立它的活動記錄區的同時建立一張嵌套層次顯示表diaplay.假定現在進入的過程層次為i,則它的diaplay表含有i+1個單元,自頂向下每個單元依次存放著現行層、直接外層、…、直至最外層(主程序,0層)等每層過程的最新活動記錄的起始地址。通過DISPLAY表可以訪問其外層過程的變數。

(5分)對下列四元式序列生成目標代碼:
A:=B*C
D:=E+A
G:=B+C
H:=G*D
其中,H在基本塊出口之後是活躍變數, R0和R1是可用寄存器。
答: 目標代碼序列
LD R0 B
MUL R0 C
LD R1 E
ADD R1 R0
LD R0 B
ADD R0 C
MUL R0 R1
ST R0 H

(5分)寫出表達式a+b*(c-d)對應的逆波蘭式、三元式序列和抽象語法樹。
答:
逆波蘭式:(abcd-*+) (1分)
三元式序列: (2分)
OP ARG1 ARG2
(1) - c d
(2) * b (1)
(3) + a (2)
抽象語法樹:(2分)

(8分)構造一個DFA,它接受={a,b}上所有包含ab的字元串。
答:
(2分)構造相應的正規式:(a|b)*ab(a|b)*

(3分)
a a

a b
b b

(3分)確定化:
I
{0,1,2} {1,2,3} {1,2}
{1,2,3} {1,2,3} {1,2,4,5,6}
{1,2} {1,2,3} {1,2}
{1,2,4,5,6} {1,2,3,5,6} {1,2,5,6}
{1,2,3,5,6} {1,2,3,5,6} {1,2,4,5,6}
{1,2,5,6} {1,2,3,5,6} {1,2,5,6}
b b
b a
a a a a

a b b
b

最小化:
{0,1,2} {3,4,5}
{0, 2},1, {3,4,5}

(6分)寫一個文法使其語言為L(G)={anbncm| m,n≥1,n為奇數,m為偶數}。
答:
文法G(S):

(8分)對於文法G(S):

1. 寫出句型b(Ma)b的最右推導並畫出語法樹。
2. 寫出上述句型的短語,直接短語和句柄。
答:
1. (4分)

2. (4分)
短語: Ma), (Ma), b(Ma)b
直接短語: Ma)
句柄: Ma)

(12分)對文法G(S):
S → a | ^ | (T)
T → T,S | S
(1) 構造各非終結符的FIRSTVT和LASTVT集合;
(2) 構造算符優先表;
(3) 是算符優先文法嗎?
(4) 構造優先函數。
答:
(1) (4分)

(2) (4分)
a ^ ( ) ,
a > >
^ > >
( < < < = <
) > >
, < < < > >

(3) 是算符優先文法,因為任何兩個終結符之間至多隻有一種優先關系。 (1分)

(4) 優先函數(3分)
a ^ ( ) ,
F 4 4 2 4 4
G 5 5 5 2 3

(8分)設某語言的do-while語句的語法形式為
S do S(1) While E
其語義解釋為:

針對自下而上的語法分析器,按如下要求構造該語句的翻譯模式,將該語句翻譯成四元式:
(1) 寫出適合語法制導翻譯的產生式;
(2) 寫出每個產生式對應的語義動作。
答:(1). 適合語法制導翻譯的文法(4分)
G(S):
R do
UR S(1) While
SU E
(2). (4分)
R do
{ R.QUAD:=NXQ }

UR S(1) While
{ U.QUAD:=R.QUAD;
BACKPATCH(S.CHAIN, NXQ) }

SU E
{ BACKPATCH(E.TC, U.QUAD);
S.CHAIN:=E.FC }

答案二:
(1) S do M1 S(1) While M2 E
M ε (4分)
(2) M ε { M.QUAD := NXQ } (4分)
S do M1 S(1) While M2 E
{
BACKPATCH(S(1).CHAIN, M2.QUAD);
BACKPATCH(E.TC, M1.QUAD);
S.CHAIN:=E. FC
}

(10分)將語句
while C>0 do if A B=0 then C:=C+D else C:=C*D
翻譯成四元式。
答:
100 (j>, C, 0, 102)
101 (j, -, -, 112)
102 (jnz, A, -, 106)
103 (j, -, -, 104)
104 (j=, B, 0, 106)
105 (j, -, -, 109)
106 (+, C, D, T1)
107 (:=, T1, -, C)
108 (j, -, -, 100)
109 (*, C, D, T2)
110 (:=, T2, -, C)
111 (j, -, -, 100)
112

(10分)設有基本塊如下:
T1:=3
T2:=A*B
T3:=9+T1
M:=A*B
T4:=C-D
L:=T3*T4
T2:=C+D
N:=T2
畫出DAG圖;
設L,M,N 是出基本塊後的活躍變數,請給出優化後的四元式序列。
答:

1. (6分)
L

*
T2,M T4 T2,N

* - +

T1 T3
3 A B 12 C D

2. (4分)
M:=A*B
S1:=C-D
L:=12*S1
N:=C+D

(8分)文法G(S)及其LR分析表如下,請給出串baba#的分析過程。
(1) S → DbB (2) D → d (3) D → ε
(4) B → a (5) B → Bba (6) B → ε
LR分析表
ACTION GOTO
b D a # S B D
0 r3 s3 1 2
1 acc
2 s4
3 r2
4 r6 S5 r6 6
5 r4 r4
6 s7 r1
7 S8
8 r5 r5
解答:
步驟 狀態 符號 輸入串
0 0 # baba#
1 02 #D baba#
2 024 #Db aba#
3 0245 #Dba ba#
4 0246 #DbB ba#
5 02467 #DbBb a#
6 024678 #DbBba #
7 0246 #DbB #
8 01 #S # acc
哈哈,估計認識!!

Ⅷ 那位大俠幫解答一下,傳址方式,傳值方式的問題

這是一個關於值傳遞和地址傳遞的問題,是程序編譯器中的常見問題。
首先說一下參數傳遞的方式,一般有5種方法(上學時候學的,現在只記得4種了)分別是 值傳遞、地址傳遞、值地址傳遞、名字傳遞、還有一個忘了。
參數傳遞的方法是將數值存放到寄存器中,然後再通過調用寄存器來改變參數。值傳遞是不管寄存器的地址,只對數值做修改。
所以值傳遞是只傳數值,但是主程序中的數值不隨子程序變化而變化。
{
子程序:
a=1,b=2;
}
{
主程序:
a=2,b=2;
call 子程序();
n=a+b;
}
結果n=4
地址傳遞是將數值所在的寄存器的地址記錄下來,子程序對地址進行修改,從而改變主程序中的數值。
在你的程序中,byval是借用value方法出的數據,所以子程序中修改的數據仍然存放在原來的位置,而主程序調用子程序時候是尋找子程序中參數所在的寄存器,值傳遞不改變寄存器的地址,所以主程序取不到想要得到的值。
byref是借用ruffer,是通過緩沖區調用子程序中n的所在寄存器的地址,然後把這個地址中的數值引入到主程序中進行計算,所以地址傳遞改變主程序結果。地址傳遞可以想像成一個堆棧,n是棧中的數值,而主程序取出來的n所在棧的地址,把這個地址告訴主程序的命令,從這個地址中取需要計算c的數值,然後再進行計算。
可能表達也不很清楚,如果想多了解一些這方面的東西的話可以找一些關於編譯原理方面的書,簡而言之記住一點,值傳遞是保護主程序數據不被隨意修改的方法,所以不可能改變主程序的結果,如果要修改主程序的結果,必須用地址傳遞。

Ⅸ 編譯原理試題 幫忙答一下

你太會投機取巧了,建議你去考試網上學習一下

Ⅹ 什麼是傳值,什麼是傳址(引用)對此,C/C++與java中的函數(方法)有什麼不同

傳值就是把某個數值、字元串或類對象復制一份,作為參數
傳址是把某個數值、字元串或類對象的地址作為參數,沒有復制過程,所以當參數位類對象、或字元串時,效率比傳值要高。
c++沒有誕生前,傳址是用指針實現的,但指針容易出錯,所以Bjarne們發明了引用,其實質還是指針。
我的理解,在這個問題上,c++和java沒有區別。

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:710
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:972
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:681
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:833
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:740
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1080
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:311
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:191
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:878
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:835