導航:首頁 > 源碼編譯 > 編譯原理傳值傳參

編譯原理傳值傳參

發布時間:2023-04-22 14:17:22

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

在C語言中,並沒有引用的概念,這個是C++的概念。
在C++的函數參數中,有兩種形式,其中
TYPE & var的形式,稱為傳引用方式;
TYPE var的形式,稱為傳值。
二者的區別為,當傳引用時,實際傳到函數中的形參,是實際參數的一個引用,而不是僅傳遞值到函數中。具體的表現有以下幾條:

1 傳引用時,形參和實參是同一個變數,即使用相同的內存空間,二者有相同的地址。而傳值時二者地址不同;悉豎
2 傳引用時,由於沒有新建變數,所以對於類對象參數,唯陸埋不會產生構造和析構。而如果是傳值調用,調用時會進行構造,退出函數時會進行析構;
3 由於傳引用使用的是原本實參的地址,所以對引用參數值的修改,會在退指螞出函數後體現在主調函數中,而傳值調用對參數的修改不會影響到主調函數。

B. 編譯原理傳地址問題

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

C. 函數中傳值跟傳參的區別

一 函數中傳值跟傳參的區別主要是概念的區別:

  1. 傳值, 是把實參的值賦值給行參。 那麼對行參的修改,不會影響實參的值 。

  2. 函數定義中的參數是形式參數,函數的調用者提供給函數的參數叫實際參數轎畝蠢。

二 在數學中,一個函數是描述每個輸入值對應唯一輸出值的耐御這種對應關系,符號通常閉陪為f(x)。

D. c++三種傳參方式(傳值 && 傳引用 && 傳指針)

以STL容器的vector為例,當以升皮vector容器作為吵讓差參數時,有三種傳參方式:
1.func(vector<int> vec),傳值
2.func(vector<int> &vec),傳引用
3.func(vector<int> *vec),傳指針
三種方滑納式對應的調用形式分別為:
1.func(vec),傳入值
2.func(vec),傳入引用
3.func(&vec), 傳入地址

E. java傳參是傳值還是傳引用

當參數類型是基本類型,復制的是值,而當參數是引用類型時寬笑,復制的也是值,只不過這個值是地址。如下例調用change(A a)有幾個過程:
(1)創建一個臨時變數
(2)將實參的值復制給臨時變數,由於是引用變數,實參的值是一個地址,故存的也是同一個地址
(3)方法中改變了臨時變數所激槐指向的地址,而實參指向的地址沒變

change(String str)同理,改變的是臨時變數所指向的地址,實參指向的地址沒變。

public Demo
{
public static void main(String[] args)
{
A a = new A();
System.out.println(a.x);//10
change(a);
System.out.println(a.x);//依然是10

}
public static void change(A a)
{
a = new A();
a.x = 20;
}
public static void change(String str)
{
str = "明巧友new string value in string pool";
//str = new String("new string in heap");
}
}

class A
{
public int x = 10;

}

F. C語言的傳值和傳址的區別

區別:對形參的影響不同

1、在譽改傳值中函數參數壓棧的是參數的副本,任何的修改是在副本上作用,沒有作用在原來的變數上。

2、傳址中壓棧的是指針變數的副本,當你對指針解指針操作時,其值是指向原來的那個變數,所以對原來變數操作。

(6)編譯原理傳值傳參擴展閱讀

函數傳參有三種傳參方式:傳值、傳址、傳引用。

1、按值傳遞

(1)形參和實參各佔一個獨立的存儲空間。

(2)形參的存儲空間是函數被調用時才分配的,調用開始戚虛殲,系統為形參開辟高沖一個臨時的存儲區,然後將各實參傳遞給形參,這是形參就得到了實參的值。

2、地址傳遞

地址傳遞與值傳遞的不同在於,它把實參的存儲地址傳送給形參,使得形參指針和實參指針指向同一塊地址。因此,被調用函數中對形參指針所指向的地址中內容的任何改變都會影響到實參。

3、引用傳遞

引用傳遞是以引用為參數,則既可以使得對形參的任何操作都能改變相應數據,又使函數調用方便。引用傳遞是在形參調用前加入引用運算符「&」。

引用為實參的別名,和實參是同一個變數,則他們的值也相同,該引用改變則它的實參也改變。





G. 為什麼在c語言中形參和實參之間傳遞的只能是值傳遞

其實c語言有猛芹兩種形參和實參之間傳值方式,一種是傳值,枝鎮畢一種是傳這個值的地址,但實際上地址也是一個值,對應計算機存儲空間上的編號,所以統稱為旅州傳值。

H. 編譯原理問題,高手進。

回答下列問題:(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
哈哈,估計認識!!

I. JavaScript 函數參數傳遞到底是值傳遞還是引用傳遞

JavaScript 函數參數傳遞到底是值傳遞還是引用傳遞
一 參數
1 所有的參數傳遞,都是傳遞值的拷貝。(如果想知道為什麼,去學習編譯原理的函數調用的參數壓棧和出棧對應內容)。
2 C傳指針進去,其實也是把這個指針值按拷貝傳送進去。但是因為指針值指向一塊外部內存空間(其實更多是堆空間,或外層棧變數空間),所以感覺可以在函數里改變外部變數。其實本質還是按拷貝傳遞,只是傳遞進去的是一個訪問變數的渠道。
因此,如果我們希望函數內能改變外部的指針值,往往傳進去的是指針變數的指針。呵呵,很多初學C的程序員,對**非常難理解。

二 返回值
返回值是按拷貝傳遞,函數出棧後,會傳出一個值,該值在調用函數的代碼段的生命周期里一直有效。相當與調用點形成一個匿名的棧變數。

變數a = function(); 而a並不等於函數里return的那個值。
其實function()執行結果自身就是一個匿名變數。(其實編譯器會檢查語法,如上面a=function這樣的語法,匿名變數不會生成,直接使用a變數拷貝返回值)
例如: function()返回int值。 完全可以 int x = function() + 6;//注意:+運算時,函數已經執行完畢,所有函數出棧操作已經結束。
很明顯function()必須有一個變數或常量參與計算,而函數里return的值會隨函數調用結束出棧而被刪除,所以必須拷貝構造傳遞出來。

J. Java中傳參和傳值的區別

傳值拆做鏈就是你改變這個值,不會改變原值;
傳引用就是你改變這個值,不會改變原值;
java方法基本數據類型是傳值,對象類型傳引用,這是千真萬確的。
當參數是對胡閉象時,無論方法體內進行了何種操作,都不會改變實參對象的引用。
當參數是對象時,只有在方法內部改變了對象的內容時,才會改旅孫變實參對象內容。

閱讀全文

與編譯原理傳值傳參相關的資料

熱點內容
加強數字貨幣國際信息編譯能力 瀏覽:584
購買的app會員怎麼退安卓手機 瀏覽:891
程序員的種類及名稱 瀏覽:292
美國程序員薪資 瀏覽:12
黑石通匯證券伺服器什麼時候到期 瀏覽:393
東方財富app里我的關注怎麼看 瀏覽:749
bm3d單反級降噪演算法 瀏覽:457
華為安卓機激活時間怎麼查詢 瀏覽:850
如何用優盤重裝伺服器系統 瀏覽:317
日本結婚三代演算法 瀏覽:920
皓強工具解壓步驟 瀏覽:690
部隊抗洪搶險命令範文 瀏覽:888
歐姆龍plc編程軟體使用教程 瀏覽:594
ai文件pdf 瀏覽:912
騰訊雲伺服器掛載混合雲 瀏覽:758
智能小車用什麼單片機 瀏覽:463
java怎麼給窗口關閉 瀏覽:940
列舉51單片機的定址方式 瀏覽:706
剪輯app怎麼寫長篇文字 瀏覽:400
app專屬流量過月租怎麼不更新 瀏覽:656