當前位置:首頁 » 編程軟體 » 編譯原理中什麼是變數

編譯原理中什麼是變數

發布時間: 2022-12-09 05:08:08

❶ 全局變數和編譯原理

程序在預處理的時候就能看到,全局的內存。

c語言編譯原理是什麼

編譯共分為四個階段:預處理階段、編譯階段、匯編階段、鏈接階段。

1、預處理階段:

主要工作是將頭文件插入到所寫的代碼中,生成擴展名為「.i」的文件替換原來的擴展名為「.c」的文件,但是原來的文件仍然保留,只是執行過程中的實際文件發生了改變。(這里所說的替換並不是指原來的文件被刪除)

2、匯編階段:

插入匯編語言程序,將代碼翻譯成匯編語言。編譯器首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,編譯器把代碼翻譯成匯編語言,同時將擴展名為「.i」的文件翻譯成擴展名為「.s」的文件。

3、編譯階段:

將匯編語言翻譯成機器語言指令,並將指令打包封存成可重定位目標程序的格式,將擴展名為「.s」的文件翻譯成擴展名為「.o」的二進制文件。

4、鏈接階段:

在示例代碼中,改代碼文件調用了標准庫中printf函數。而printf函數的實際存儲位置是一個單獨編譯的目標文件(編譯的結果也是擴展名為「.o」的文件),所以此時主函數調用的時候,需要將該文件(即printf函數所在的編譯文件)與hello world文件整合到一起,此時鏈接器就可以大顯神通了,將兩個文件合並後生成一個可執行目標文件。

❸ 書上說,C語言中的「變數」可以理解為一段確定長度的、用於存放數據的內存空間,這個我就不理解了

常量和變數是某種類型的量。

在C,Pascal,Basic,以及匯編語言等計算機語言。
這些量必須存儲在某些地方,或者寫到二進制代碼裡面(計算機指令)。
寫到指令里的常量是不可變的。一般不會有存儲空間的概念的。
其他變數和常量必須存儲在某個位置(地址),指令執行時才能存取這些量(數據)。
這樣變數就和存儲空間聯系起來了!
這個存儲空間,實際上,也是比較抽象的概念。實際上並不能用物理上的空間來理解他。
這只是隱喻,是一種象徵手法。用可以理解的概念,來表示難以理解的概念。
雖然我們會說物理內存,但是物理內存只是內存條上實際內存的一種說法。並不是內存上的位置的空間概念。
雖然確實和實際空間位置相關。但是大家都不會這樣理解。

❹ c語言中(int)什麼意思

看了你的追問這么多我知道他們回答的不是樓主想要的。

先引來這段代碼:

char*
//這是字元指針類型(所謂類型也就是附加char的一種),只有在定義時才這樣寫,就像你寫int
一樣。

問題:什麼是指針?有何作用?在c語言在存的價值及意義是什麼?

答:指針在計算機硬體中是不存在這個名字,而在計算機中只有地址。還是很混,為什麼要區分開地址和指針搞的人不明白呢?因為計算機處理數據時候他都是按地址找到相應位置來處理的,就像你想去北京旅遊你肯定想要找到地址才能去。比如你定義一個變數int
a=99;
編譯器會知道是int型,分配2個位元組大小來存儲,在內存在的編號如是2000;
當你用printf("%d",a);
這時計算機的內存寄存器通過定址找到2000這個地址,然後讀取該地址上保存的數據99。所以在內存在內存中每個數據不是亂放起的而是通過編號統一管理的。

那指針呢,他與地址有何區別?我們所說的指針是針對程序中才能說這一詞。為什呢?因為指針是專用來保存地址的變數即指針變數(在c語言中所有的數據內存地址數都是2個位元組大小,一信可用sizeof()測一下,如sizeof(可寫任何指針變數)
都是2)
。用指針變數訪問一個數據就需要間接訪問,而變數則可直接仿問。注意:什麼是指針,什麼是指針變數?指針即地址(程序中可這樣說),因為上面所說了訪問一個變數就是先找到該變數的地址。而指針是用來專用保存地址的,如:int
a=99;
int
*p=&a;
所以你訪問*p的值也就是訪問a的地址或是通過p保存的址值即a的地址來訪問。
注意:在定義之後的*p,p是有區別的。輸出p即輸出p的地址,輸出*p即輸出該地址中的內容即值.
指針變數就是專用存放地址的變數叫指針變數。因為計算機內存處理數據最終是物理電路是操作的,所以終歸轉化為地址,因為每條內存都有相應的編號,.這符合人們的思想.用指針地址處理運行程序速度快、使用靈活。

char*
//定義所有數據類型只要是指針類型都是2個位元組,那麼前面的char,int那些關鍵字有何用呢?因為類型匹配,每個數據佔用的內存空間大小不一的。

*a
//*a
表示讀取該a的地址的值是多少

char*p

*p=&c分別都是什麼意思
//
你這段代碼是錯的。*p是表示讀取值,而p是表示讀取地址,要區分明白。&c以"&"開頭的表示該變數的地址,&c表示c的地址。你將一個地址賦給一個*p即用來存值的變數顯然不符合。

所以應該是

*p=c;
//值與值賦
在初始定義時可寫成
char
*p=4;
//這也值與值的賦

p=&c;
//地址與地址型賦
在初始定義時可寫成
char
*p=&c;
//這也行。

若還不明白本人勸你沒必要追究到底,等你學到後面會越學越明白的,計算機原理,編譯原理等等。

還有問題請回復^
_
^

❺ C語言中變數為什麼不能重復定義,我想問一下C語言裡面的具體的機制。

因為定義就意味著給變數分配空間。暫不管重復定義有可能產生空間分配不合理的問題,首先變數名就是一個地址,只不過這個地址是由系統分配的,定義後,地址分出來,存儲空間也被分配出來,變數名--地址就被固定下來。重復定義的話就要分出新地址,分配新的存儲空間,原來的變數名--地址,與後來的變數名--地址,產生沖突,一樣的名字,卻是不同的地址,這是不允許的。
但是這種問題只會出現在標識符的鏈接屬性一樣的情況下,可以簡單的理解為在同一個作用域重復定義是不可以的。如果在兩個函數里分別定義int a,這種定義是可以的。因為這個a處於不同的作用域,就不算是重復定義了。
以上屬於自己的理解,歡迎指正。

❻ 編譯原理全部的名詞解釋

書上有別那麼懶!.
編譯過程的六個階段:詞法分析,語法分析,語義分析,中間代碼生成,代碼優化,目標代碼生成
解釋程序:把某種語言的源程序轉換成等價的另一種語言程序——目標語言程序,然後再執行目標程序.解釋方式是接受某高級語言的一個語句輸入,進行解釋並控制計算機執行,馬上得到這句的執行結果,然後再接受下一句.
編譯程序:就是指這樣一種程序,通過它能夠將用高級語言編寫的源程序轉換成與之在邏輯上等價的低級語言形式的目標程序(機器語言程序或匯編語言程序).
解釋程序和編譯程序的根本區別:是否生成目標代碼
句子的二義性(這里的二義性是指語法結構上的.):文法G[S]的一個句子如果能找到兩種不同的最左推導(或最右推導),或者存在兩棵不同的語法樹,則稱這個句子是二義性的.
文法的二義性:一個文法如果包含二義性的句子,則這個文法是二義文法,否則是無二義文法.
LL(1)的含義:(LL(1)文法是無二義的; LL(1)文法不含左遞歸)
第1個L:從左到右掃描輸入串 第2個L:生成的是最左推導
1 :向右看1個輸入符號便可決定選擇哪個產生式
某些非LL(1)文法到LL(1)文法的等價變換: 1. 提取公因子 2. 消除左遞歸
文法符號的屬性:單詞的含義,即與文法符號相關的一些信息.如,類型、值、存儲地址等.
一個屬性文法(attribute grammar)是一個三元組A=(G, V, F)
G:上下文無關文法.
V:屬性的有窮集.每個屬性與文法的一個終結符或非終結符相連.屬性與變數一樣,可以進行計算和傳遞.
F:關於屬性的斷言或謂詞(一組屬性的計算規則)的有窮集.斷言或語義規則與一個產生式相聯,只引用該產生式左端或右端的終結符或非終結符相聯的屬性.
綜合屬性:若產生式左部的單非終結符A的屬性值由右部各非終結符的屬性值決定,則A的屬性稱為綜合屬
繼承屬性:若產生式右部符號B的屬性值是根據左部非終結符的屬性值或者右部其它符號的屬性值決定的,則B的屬性為繼承屬性.
(1)非終結符既可有綜合屬性也可有繼承屬性,但文法開始符號沒有繼承屬性.
(2) 終結符只有綜合屬性,沒有繼承屬性,它們由詞法程序提供.
在計算時: 綜合屬性沿屬性語法樹向上傳遞;繼承屬性沿屬性語法樹向下傳遞.
語法制導翻譯:是指在語法分析過程中,完成附加在所使用的產生式上的語義規則描述的動作.
語法制導翻譯實現:對單詞符號串進行語法分析,構造語法分析樹,然後根據需要構造屬性依賴圖,遍歷語法樹並在語法樹的各結點處按語義規則進行計算.
中間代碼(中間語言)
1、是復雜性介於源程序語言和機器語言的一種表示形式.
2、一般,快速編譯程序直接生成目標代碼.
3、為了使編譯程序結構在邏輯上更為簡單明確,常採用中間代碼,這樣可以將與機器相關的某些實現細節置於代碼生成階段仔細處理,並且可以在中間代碼一級進行優化工作,使得代碼優化比較容易實現.
何謂中間代碼:源程序的一種內部表示,不依賴目標機的結構,易於代碼的機械生成.
為何要轉換成中間代碼:(1)邏輯結構清楚;利於不同目標機上實現同一種語言.
(2)便於移植,便於修改,便於進行與機器無關的優化.
中間代碼的幾種形式:逆波蘭記號 ,三元式和樹形表示 ,四元式
符號表的一般形式:一張符號表的的組成包括兩項,即名字欄和信息欄.
信息欄包含許多子欄和標志位,用來記錄相應名字和種種不同屬性,名字欄也稱主欄.主欄的內容稱為關鍵字(key word).
符號表的功能:(1)收集符號屬性 (2) 上下文語義的合法性檢查的依據: 檢查標識符屬性在上下文中的一致性和合法性.(3)作為目標代碼生成階段地址分配的依據
符號的主要屬性及作用:
1. 符號名 2. 符號的類型 (整型、實型、字元串型等))3. 符號的存儲類別(公共、私有)
4. 符號的作用域及可視性 (全局、局部) 5. 符號變數的存儲分配信息 (靜態存儲區、動態存儲區)
存儲分配方案策略:靜態存儲分配;動態存儲分配:棧式、 堆式.
靜態存儲分配
1、基本策略
在編譯時就安排好目標程序運行時的全部數據空間,並能確定每個數據項的單元地址.
2、適用的分配對象:子程序的目標代碼段;全局數據目標(全局變數)
3、靜態存儲分配的要求:不允許遞歸調用,不含有可變數組.
FORTRAN程序是段結構,不允許遞歸,數據名大小、性質固定. 是典型的靜態分配
動態存儲分配
1、如果一個程序設計語言允許遞歸過程、可變數組或允許用戶自由申請和釋放空間,那麼,就需要採用動態存儲管理技術.
2、兩種動態存儲分配方式:棧式,堆式
棧式動態存儲分配
分配策略:將整個程序的數據空間設計為一個棧.
【例】在具有遞歸結構的語言程序中,每當調用一個過程時,它所需的數據空間就分配在棧頂,每當過程工作結束時就釋放這部分空間.
過程所需的數據空間包括兩部分
一部分是生存期在本過程這次活動中的數據對象.如局部變數、參數單元、臨時變數等;
另一部分則是用以管理過程活動的記錄信息(連接數據).
活動記錄(AR)
一個過程的一次執行所需要的信息使用一個連續的存儲區來管理,這個區 (塊)叫做一個活動記錄.
構成
1、臨時工作單元;2、局部變數;3、機器狀態信息;4、存取鏈;
5、控制鏈;6、實參;7、返回地址
什麼是代碼優化
所謂優化,就是對代碼進行等價變換,使得變換後的代碼運行結果與變換前代碼運行結果相同,而運行速度加快或佔用存儲空間減少.
優化原則:等價原則:經過優化後不應改變程序運行的結果.
有效原則:使優化後所產生的目標代碼運行時間較短,佔用的存儲空間較小.
合算原則:以盡可能低的代價取得較好的優化效果.
常見的優化技術
(1) 刪除多餘運算(刪除公共子表達式) (2) 代碼外提 +刪除歸納變數+ (3)強度削弱; (4)變換循環控制條件 (5)合並已知量與復寫傳播 (6)刪除無用賦值
基本塊定義
程序中只有一個入口和一個出口的一段順序執行的語句序列,稱為程序的一個基本塊.
給我分數啊.

❼ C語言變數的定義和聲明有什麼不同

C語言變數的定義和聲明的不同之處:

1、變數在使用前就要被定義或者聲明;

2、在一個程序中,變數只能定義一次,卻可以聲明多次;

3、定義分配存儲空間,而聲明不會

(7)編譯原理中什麼是變數擴展閱讀:

變數的定義:用於為變數分配存儲空間,還可以為變數指定初始值。在程序中,變數有且僅有一個定義。

聲明:用於向程序表明變數的類型和名字。

定義也是聲明:當定義變數的時候我們聲明了它的類型和名字。可以通過使用extern聲明變數名而不定義它。不定義變數的聲明包括對象名、對象類型和對象類型前的關鍵字extern。

extern聲明不是定義,也不分配存儲空間。事實上它只是說明變數定義在程序的其他地方。程序中變數可以聲明多次,但只能定義一次。

只有當聲明也是定義時,聲明才可以有初始化式,因為只有定義才分配存儲空間。初始化式必須要有存儲空間來進行初始化。如果聲明有初始化式,那麼它可被當作是定義,即使聲明標記為extern。

任何在多文件中使用的變數都需要有與定義分離的聲明。在這種情況下,一個文件含有變數的定義,使用該變數的其他文件則包含該變數的聲明(而不是定義)。

熱點內容
機械戰警用什麼配置好看 發布:2024-05-06 20:27:12 瀏覽:435
win10添加python環境變數 發布:2024-05-06 20:27:12 瀏覽:313
並聯臂演算法 發布:2024-05-06 20:02:11 瀏覽:623
cf跟dnf哪個需求配置高 發布:2024-05-06 20:01:23 瀏覽:657
什麼配置皮筋能打老鼠嗎 發布:2024-05-06 19:54:32 瀏覽:742
壓縮機油壓差報警 發布:2024-05-06 19:45:08 瀏覽:336
打游戲腳本好不好 發布:2024-05-06 19:44:00 瀏覽:235
七日殺如何轉移伺服器 發布:2024-05-06 19:43:04 瀏覽:429
唐plusdmi買哪個配置 發布:2024-05-06 19:36:48 瀏覽:148
汽車安卓屏開燈效果怎麼弄 發布:2024-05-06 19:12:36 瀏覽:76