4種參數傳遞方式編譯原理
『壹』 編譯原理---程序執行的兩種方式是什麼
由於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文件中。其中方式一,方式二隻能實現字元串參數的傳遞,方式三,四,五,六可以實現對象的傳遞(方式六需要對象序列化後進行存儲)方式一,方式二,方式三數據傳遞只能請求頁面獲取數據,而方式四,五,六可以在多個不同頁面獲取數據對象方式四和六保存的數據對象都是和某個用戶相關的信息,不同的是方式四將數據保存到伺服器內存中,方式六將數據保存到客戶端內存中。方式五保存的數據對象都是和所有用戶相關的信息,數據也是保存到伺服器內存中。
『貳』 參數傳遞的主要方式和特點
你指的是c++嗎?函數傳值有三種方式:按值傳遞(pass-by-value),按地址傳遞(pass-by-address)和按引用傳遞(pass-by-reference)。不同的是,按值傳遞方式中,函數部分不能改變主函數中實參的值。而按地址傳遞和按引用傳遞均可以改變主函數中實參的值。按值傳遞,實參和形參均為同一類型的對象。例如:void f(int b){...}int main(){int a;...f(a);}按地址傳遞,實參為變數的地址,而形參為同類型的指針。void f(int* b){...}
『叄』 方法的參數傳遞有哪些方式區別時什麼
有兩種方式:值類型和引用類型在把數據賦給值類型和引用類型的時候,兩者表現完全不同:
● 在把數據賦給一個值類型時,數據存儲在堆棧上的變數中。
● 在把數據賦給一個引用類型時,變數中只存儲一個引用,數據則存儲在託管堆上。
理解堆棧和堆之間的區別是非常重要的。堆棧是一個比較小的內存區域,進程和線程在其中存儲大小固定的數據塊。例如,無論數據的實際值是多少,存儲整數和小數類型所需要的位元組數都不會變化。因此這種變數在堆棧中的位置可以高效地確定(當一個過程需要提取某個變數時,就必須搜索堆棧。如果堆棧包含的變數具有動態的內存大小,這種搜索就需要較長的時間)。
引用類型沒有固定的大小。例如,字元串的大小可以在2位元組到接近系統中所有的可用內存之間變化。引用類型大小的不確定性意味著,它們包含的數據更適合存儲在堆上,而不是堆棧上,但是,引用類型的地址(即數據在堆上的位置)有固定的大小,所以可以存儲在堆棧上。把引用存儲在堆棧上,整個程序的運行速度會快得多,因為進程可以快速定位與變數中的數據。
固定大小的變數和大小動態變化的變數分別存儲在堆棧和堆上,會使對這兩種變數的操作方式產生差異。下面通過比較System.Drawing.Point結構(一種值類型)和System.Text. StringBuilder類(一種引用類型)來說明這一點。
Point結構是.NET圖形庫的一部分,而該圖形庫是System.Drawing命名空間的一部分。StringBuilder類是System.Text命名空間的一部分,用於高效地編輯字元串。命名空間將在第8章論述。
下面先看看如何使用System.Drawing.Point結構:
Dim ptX As New System.Drawing.Point(10, 20)
Dim ptY As New System.Drawing.Point
ptY = ptX
ptX.X = 200
Console.WriteLine(ptY.ToString())
這個運算的輸出是{X=10, Y=20},這看起來是符合邏輯的。代碼在將ptX復制到ptY後,包含在ptX中的數據就復制到堆棧上與ptY相關的位置上。當改變ptX的值時,只有堆棧上與ptX相關的內存被更新,改變ptX的值不會影響ptY。但引用類型不是這樣。考慮下面的代碼,它使用了System.Text.StringBuilder類:
Dim objX As New System.Text.StringBuilder("Hello World")
Dim objY As System.Text.StringBuilder
objY = objX
objX.Replace("World", "Test")
Console.WriteLine(objY.ToString())
這段代碼的運行結果是Hello Test,而不是Hello World。從上面使用Point示例可以看出,在把一個值類型賦給另一個值類型時,會復制存儲在堆棧上的數據。因此,在前一個例子中,將objY賦給objX時,堆棧上與objX相關的數據會復制到堆棧上與objY相關的數據上。但是,在本例中,復制的不是實際的數據,而是存儲在託管堆上的數據的地址,即objX和objY現在引用的是相同的數據。當堆上的數據發生變化時,如果某個變數保存了對該內存的引用,則與該變數相關的數據就會發生變化。這就是引用類型的默認操作方式,稱為淺度復制(shallow )。
『肆』 那位大俠幫解答一下,傳址方式,傳值方式的問題
這是一個關於值傳遞和地址傳遞的問題,是程序編譯器中的常見問題。
首先說一下參數傳遞的方式,一般有5種方法(上學時候學的,現在只記得4種了)分別是 值傳遞、地址傳遞、值地址傳遞、名字傳遞、還有一個忘了。
參數傳遞的方法是將數值存放到寄存器中,然後再通過調用寄存器來改變參數。值傳遞是不管寄存器的地址,只對數值做修改。
所以值傳遞是只傳數值,但是主程序中的數值不隨子程序變化而變化。
{
子程序:
a=1,b=2;
}
{
主程序:
a=2,b=2;
call 子程序();
n=a+b;
}
結果n=4
地址傳遞是將數值所在的寄存器的地址記錄下來,子程序對地址進行修改,從而改變主程序中的數值。
在你的程序中,byval是借用value方法出的數據,所以子程序中修改的數據仍然存放在原來的位置,而主程序調用子程序時候是尋找子程序中參數所在的寄存器,值傳遞不改變寄存器的地址,所以主程序取不到想要得到的值。
byref是借用ruffer,是通過緩沖區調用子程序中n的所在寄存器的地址,然後把這個地址中的數值引入到主程序中進行計算,所以地址傳遞改變主程序結果。地址傳遞可以想像成一個堆棧,n是棧中的數值,而主程序取出來的n所在棧的地址,把這個地址告訴主程序的命令,從這個地址中取需要計算c的數值,然後再進行計算。
可能表達也不很清楚,如果想多了解一些這方面的東西的話可以找一些關於編譯原理方面的書,簡而言之記住一點,值傳遞是保護主程序數據不被隨意修改的方法,所以不可能改變主程序的結果,如果要修改主程序的結果,必須用地址傳遞。
『伍』 函數的參數傳遞指的是什麼有哪幾種傳遞方式
函數的參數傳遞:當進行函數調用的時候,要填入與函數形式參數個數相同的實際參數,在程序運行的過程中,實參會將參數值傳遞給形參,這就是函數的參數傳遞。
函數參數傳遞有以下三種:
一. 值傳遞
1. 用值傳遞方式,實際上是把實參的內容復制到形參中,實參和形參是存放在兩個不同的內存空間中。在函數體內對形參的一切修改對實參都沒有影響;
2. 如果形參是類的對象,利用值傳遞的話每次都要調用類的構造函數構造對象,效率比較低。
二. 指針傳遞(地址傳遞)
1. 當進行指針傳遞的時候,形參是指針變數,實參是一個變數的地址或者是指針變數,調用函數的時候,形參指向實參的地址;
2. 指針傳遞中,函數體內可以通過形參指針改變實參地址空間的內容。
三. 傳遞引用
1.引用實際上是某一個變數的別名,和這個變數具有相同的內存空間;
2. 實參把變數傳遞給形參引用,相當於形參是實參變數的別名,對形參的修改都是直接修改實參;
3. 在類的成員函數中經常用到類的引用對象作為形參,大大的提高代碼的效率。
『陸』 高級程序設計語言參數傳遞的常用方法有哪幾種(至少兩種)
1.傳值,即調用的函數只能得到拷貝值;2.傳引用,相當於傳入指針,可以對傳入的參數進行修改,
『柒』 函數調用時參數傳遞有哪幾種方式
一般有值傳遞、指針傳遞、引用傳遞三種方式。
值傳遞是指在調用函數時將實際參數復制一份傳遞到函數中,這樣在函數中如果對參數進行修改,將不會影響到實際參數。
引用傳遞是指在C++中,函數參數的傳遞方式有引用傳遞。所謂引用傳遞是指在調用函數時將實際參數的地址傳遞到函數中,那麼在函數中對參數所進行的修改,將影響到實際參數。
『捌』 c語言中的參數傳遞方式有哪些
是函數參數的傳遞方式吧。c語言的話是:值傳遞和指針(地址)傳遞。c++的話除了c語言的兩種方式外還有引用傳遞。
『玖』 參數傳遞的幾種方式 編譯原理
由於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文件中。
其中方式一,方式二隻能實現字元串參數的傳遞,方式三,四,五,六可以實現對象的傳遞(方式六需要對象序列化後進行存儲)
方式一,方式二,方式三數據傳遞只能請求頁面獲取數據,而方式四,五,六可以在多個不同頁面獲取數據對象
方式四和六保存的數據對象都是和某個用戶相關的信息,不同的是方式四將數據保存到伺服器內存中,方式六將數據保存到客戶端內存中。
方式五保存的數據對象都是和所有用戶相關的信息,數據也是保存到伺服器內存中。
『拾』 編譯原理問題,高手進。
回答下列問題:(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
哈哈,估計認識!!