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

編譯原理傳參方式

發布時間:2022-05-03 09:36:05

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

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

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

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

B. 高分求國防科技大學2004年編譯原理試題A卷試題及答案

自己做的,可能有欠考慮的地方,還望指教:
(1)9,7
(2)18,14
分析:
(1)傳值。執行Q(a[2]);時,a[1]是全局變數,a[1]:=a[1]+2;後變為7,b傳的是a[2]的值,所以是另開辟空間存的,a[2]的值不變。執行Q(a[1]);時,a[1]:=a[1]+2;後變為9,b傳的是a[1]的值,所以是另開辟空間存的,a[1]的值保持為9。
(2)傳地址。執行Q(a[2]);時,a[1]是全局變數,a[1]:=a[1]+2;後變為7,b傳的是a[2]的地址,所以a[2]的值變為14。執行Q(a[1]);時,a[1]:=a[1]+2;後變為9,b傳的是a[1]的地址,所以a[1]的值變為18。

原來你要整套的題啊,這個我可就無能為力了,俺不是國防科大的人啊,不好意思了。o(╯□╰)o

C. c語言函數參數傳遞的是值還是拷貝

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

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

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

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

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

E. c++函數傳參同名變數為啥不會沖突

這個當然不會沖突,因為函數的形參啊局部變數什麼的作用域就在函數內部,而且編譯以後,通俗得講,形參是沒有名字的。也就是說,這就是為什麼你聲明一個函數原型的時候,int hanshu(int);是合法的,因為匹配的時候,編譯器只看類型,並把數值傳遞進去,名字是給人看的。

還有疑問請HI我

F. 編譯原理---程序執行的兩種方式是什麼

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

G. 編譯原理試題 幫忙答一下

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

H. 編譯原理文法分析

改完了,能文法分析出來了!!
大概 跟你說下 你的錯誤吧:
出錯地點:
1.聲明的stack[50]沒有初始化;
2.stack的入棧是錯誤的,按照你的方式,如果原來有TM,再加入T->FN,則M就被擠出來了.(這里很關鍵,你對照我給你改的再看看)
3.s指針在你入棧操作以後並沒有指向棧頂,而是保持了不變,這肯定是有問題的.(傳入push函數的時候直接傳參數s就好了.)
4.if(*s==*p){***}else{}的else的右括弧管轄的范圍 有錯誤

不嫌棄的話,可以去http://blog.csdn.net/fangguanya,我的BLOG,不怎麼充實,呵呵,有這個程序的運行結果的. 謝謝 呵呵.
總之你對照我給你改的再看看吧. 我把我的測試輸出 也給保留了.你好對照點.
(PS.我用的vs2005,用的時候你改下頭申明,其他一樣)

// grammar.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
using namespace std;

char * spush(char *stack,char *pt);
bool analyse(char *p);

void main()
{
//將分析串存放在二維數組中
char input[5][10]={"i+i#",
"i*(i+i)#",
"i*i+i#",
"i+*#",
"+i*i#"};
bool flag; //定義一個布爾型的標記量
for(int h=0;h<5;++h)
{
flag=analyse(input[h]);
if(flag) cout<<"恭喜你!"<<input[h]<<"語法分析成功,合法!"<<endl;
else cout<<"對不起!"<<input[h]<<"語法分析失敗,非法!"<<endl;
}
int aaa;
cin>>aaa;
}
//定義各一將串逆序入棧的函數
char * spush(char *stack,char *pt)
{
int l=0;
//while循環的作用是將指針指向字元串的末尾,然後再由後向前入棧,從而實現逆序
while(*pt!='\0')
{
pt++;
l++;
}

if (*stack == '#')
{
stack++;
}
while(l)
{
pt--;
char cTempIntoStack = (*pt);
*stack=cTempIntoStack;
stack++;
l--;
}
stack--; //由於前面向前加了一位,要返回
////////////////
return stack;
///////////////////////////////////

}

/*LL(1)分析表
i + * ( ) #
E TM +TM
F i (E)
M TM e e
N e *FN e e
T FN FN
*/

//分析函數
bool analyse(char *p){
char analyseTable[5][6][4]={
"TM", "", "", "TM", "", "",
"i", "", "", "(E)", "", "",
"", "+TM", "", "", "e", "e",
"", "e", "*FN", "", "e", "e",
"FN", "", "", "TN", "", ""
};
char *stack = new char[50]; //定義一個棧空間
for (int iStack = 0;iStack<50 ;iStack++)
{
stack[iStack] = 0;
}
char *s=stack; //用指針*s指向棧的起始地址
*s='#'; //將「#」入棧
s++; //指針加1
*s='E'; //將「E」入棧
//下面的while循環實現字元串的詞法分析操作

int count = 0;

while(*s!='#' || *p!='#'){
count++;
char * temp = s;
cout<<"NO."<<count<<endl;
cout<<"STACK"<<endl;
while (*temp != '#')
{
cout<<*temp<<" ";
temp--;
}
cout<<endl;

int x,y;
//若果棧頂數據和分析串的字元匹配,則將符號棧的棧頂數據出棧(即將棧頂指針減1)
if(*s==*p){
cout<<"Before :"<<*s<<endl;
s--;
p++;
cout<<"After :"<<*s<<endl;
}
//當符號棧和分析串的字元不匹配時,查分析表
else {
switch(*s){
case 'E':x=0;break;
case 'F':x=1;break;
case 'M':x=2;break;
case 'N':x=3;break;
case 'T':x=4;break;
default:return false;
}
switch(*p){
case 'i':y=0;break;
case '+':y=1;break;
case '*':y=2;break;
case '(':y=3;break;
case ')':y=4;break;
case '#':y=5;break;
default:return false;
}
//若果對應的為空,則分析串非法,退出
if(analyseTable[x][y][0]=='\0') return false;
//若查表所對應的為'e',則將符號棧的棧頂數據出棧
else if(analyseTable[x][y][0]=='e') s--;
//其它,這時將查表所得的項逆序入符號棧
else {
s=spush(s,analyseTable[x][y]);
}
}
}
return true; //分析成功,返回
}

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

由於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文件中。

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

J. 編譯原理傳地址問題

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

閱讀全文

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

熱點內容
噴油螺桿製冷壓縮機 瀏覽:577
python員工信息登記表 瀏覽:375
高中美術pdf 瀏覽:158
java實現排列 瀏覽:511
javavector的用法 瀏覽:980
osi實現加密的三層 瀏覽:230
大眾寶來原廠中控如何安裝app 瀏覽:912
linux內核根文件系統 瀏覽:241
3d的命令面板不見了 瀏覽:524
武漢理工大學伺服器ip地址 瀏覽:147
亞馬遜雲伺服器登錄 瀏覽:523
安卓手機如何進行文件處理 瀏覽:70
mysql執行系統命令 瀏覽:929
php支持curlhttps 瀏覽:142
新預演算法責任 瀏覽:443
伺服器如何處理5萬人同時在線 瀏覽:249
哈夫曼編碼數據壓縮 瀏覽:424
鎖定伺服器是什麼意思 瀏覽:383
場景檢測演算法 瀏覽:616
解壓手機軟體觸屏 瀏覽:348