1. 程序語言編譯器是怎樣被計算機識別的
源代碼是由字元組成的吧?
明白這一點就好辦了
編譯器首先將你寫的代碼讀入內存,然後尋找代碼中的關鍵字、標識符等信息,建立一個所謂的符號表,根據這個符號表對你的源代碼進行檢查,檢查的依據正是該語言的語法和句法規則。比如是否有變數重復定義錯誤、是否有類型不兼容錯誤,是否有遺漏語句分隔符錯誤等等。這些都是比較簡單的,例如根據語言的關鍵字表可以檢查是否有非法的關鍵字(語句分隔符之後的下一個有效字元一定是一個關鍵字或已定義的標識符,因此很容易識別並挑出其中的關鍵字進行檢查),其它檢查也是類似的。
檢查沒有問題後,編譯器開始鏈接和映射操作(該過程在檢查階段也有使用),將你的源程序翻譯成匯編程序或其它中間程序。這一步是最復雜的,因為句法和語法比較簡單,但整個程序的邏輯卻復雜的多,而且編譯器還要負責在不改變代碼原意的前提下將代碼盡可能地進行優化。
最後就是將生成的匯編代碼翻譯為機器語言,這一步是最簡單的,因為匯編只是將機器語言簡單符號化而已,現在的編譯理論已經能夠確保將匯編代碼准確地翻譯為機器碼了。
以上。
2. C語言的關鍵字是什麼,為什麼叫關鍵字,怎麼來的
1.關鍵字就是C語言編譯器識別專用的字元串。
2.因為這些是C里規定死並且比較重要的字元串(key words)所以叫關鍵字的,好像你名字一樣。
3.開發C語言的人定下來的。
補充一下,下次千萬別問這種問題啊,就好像你問別人為什麼要叫李四一樣。
3. 簡述C語言中標識符和關鍵字的概念與區別
標識符是在程序中使用的變數名、函數名、標號等統稱為標識符。除庫函數的函數名由系統定義外,其餘都由用戶自定義。C 規定,標識符只能是字母(A~Z,a~z)、數字(0~9)、下劃線()組成的字元串,並且其第一個字元必須是字母或下劃線。
在使用標識符時還必須注意以下幾點:
(1)標准C不限制標識符的長度,但它受各種版本的C 語言編譯系統限制,同時也受到具體機器的限制。例如在某版本C 中規定標識符前八位有效,當兩個標識符前八位相同時,則被認為是同一個標識符。
(2)在標識符中,大小寫是有區別的。例如BOOK和book 是兩個不同的標識符。
(3)標識符雖然可由程序員隨意定義,但標識符是用於標識某個量的符號。因此,命名應盡量有相應的意義,以便閱讀理解,作到「顧名思義」。
關鍵字你看一看這一個
4. 操作系統和編譯器是怎麼識別全局變數和局部
操作系統,只管調度進程,線程編譯器根據編程語言的定義,確定變數的作用於,存儲類型,生命周期!
定義在函數外部的變數,只有文件靜態變數,和外部變數
外部變數,是實實在在的全局變數,不論作用域還是生命周期。
靜態變數是局部作用域的,生命周期為,程序的生命周期的變數。
自動變數和函數參數,是局部作用域的生命周期為函數結束的局部變數。
寄存器變數,用register定義,是局部變數;
函數內部的靜態變數,語句組內部的靜態變數,局部作用域的,生命周期為,程序的生命周期的變數。
靜態變數,編譯器,可以通過static關鍵字知道。
自動變數,1)函數內部定義的非靜態變數,非寄存器變數是自動變數。
2)函數參數,只能是自動變數,不過也可能定義在寄存器中。
這和調用約定有關,因此不可以用register定義。
C語言沒有全局變數這種數據類型。
只有4種存儲類型,和變數的作用域與生命周期的概念。
C++同樣沒有全局變數這種數據類型。
有另外的兩種作用域
1)namespace作用域。
2)類(類型)作用域。
C只有全局,文件,函數以及函數內部的語句組,4種逐漸縮小的作用域。
其中內層,對外部作用域,具有完全的遮蔽作用。
C++可以通過作用域限定符,區分不同作用域(類,名空間)的名字。
類作用域,可以通過訪問許可權,限制外部的訪問權。
函數作用域(語句組作用域)是封閉的作用域,外部不可以使用函數內部定義的名字。
也不會和外部有命名沖突,只會遮蔽外部的名字。
類作用於,和名空間由於訪問方式不同,命名沖突和遮蔽有些特殊。
函數和全局域,基本不會和類作用域有命名沖突,除非類方法內部。
命名空間,可以避免命名沖突。
類繼承體系中,則有遮蔽現象。
還有訪問許可權問題。
實際上,全局變數,有兩個概念可以判定
1)作用域(空間)===>由定義和聲明位置,和定義和聲明使用的關鍵字決定。
2)生命周期(時間)===>外部和靜態變數,的生命周期是全局的,從初始化到程序結束。
函數參數,和函數局部非靜態變數,是局部變數
函數參數的傳遞,是跨函數的(實參,變成形參);
函數內部定義的,局部變數,只有定義處可見,作用域是函數甚至語句組局部,
其中靜態變數,生命周期是全局的,非靜態是函數甚至語句組的。
全局變數,不是C,C++的概念。
而是,使用編程語言的程序員的概念。
所以,全局變數和C,C++的存儲類型,作用域,生命周期等,不是一一對應的概念。
所以,可以有不同的理解。
所以這個概念是很模糊的,不清晰的。
比如局部靜態變數,類的靜態變數,是否全局變數,就不是可以清晰的說明的。
5. C語言關鍵字是什麼
所謂關鍵字就是已被 C語言編輯工具本身使用, 不能作其它用途使用的字。
auto :聲明自動變數 一般不使用
double :聲明雙精度變數或函數
int: 聲明整型變數或函數
struct:聲明結構體變數或函數
break:跳出當前循環
else :條件語句否定分支(與 if 連用)
long :聲明長整型變數或函數
switch :用於開關語句
case:開關語句分支
enum :聲明枚舉類型
register:聲明積存器變數
typedef:用以給數據類型取別名(當然還有其他作用)
char :聲明字元型變數或函數
extern:聲明變數是在其他文件正聲明(也可以看做是引用變數)
return :子程序返回語句(可以帶參數,也看不帶參數)
union:聲明聯合數據類型
const :聲明只讀變數
float:聲明浮點型變數或函數
short :聲明短整型變數或函數
unsigned:聲明無符號類型變數或函數
continue:結束當前循環,開始下一輪循環
for:一種循環語句(可意會不可言傳)
signed:生命有符號類型變數或函數
void :聲明函數無返回值或無參數,聲明無類型指針(基本上就這三個作用)
default:開關語句中的「其他」分支
goto:無條件跳轉語句
sizeof:計算數據類型長度
volatile:說明變數在程序執行中可被隱含地改變
do :循環語句的循環體
while :循環語句的循環條件
static :聲明靜態變數
if:條件語句
6. 編譯器怎麼區分標識符和字元
首先要清楚標識符和字元的定義
標識符是程序員自己規定的具有特定含義的單詞,比如類名稱,屬性名稱,變數名等。
舉例子就是
class
string
字元是指計算機中使用的字母、數字、字和符號
舉例子就是
1,2,3,abc
然後要強調,編譯器是無法區分標識符和字元的,只有人事先為其規定好規則的情況下,編譯器才會按照標識符的方式去讀取。打個比方,我規定了class為類標識符,那當我程序里
出現了class
test時,編譯器就會認為test是類而不是字元。不知道能不能理解,不過是個好問題
7. 1.C編譯程序如何准確識別整型short、int、long和實型float、double、long
編譯器根據 short int 這些類型說明符來識別變數是什麼,你寫的關鍵字就是讓編譯器識別數據類型用的。。。准確識別識別是因為變數聲明的原因,也是為什麼C必須進行變數類型聲明。。。
如果呢是只自己如何快速識別變數類型,有一個很特別的命名規則,可以讓你一眼看出類型,
比如int型 你可以用 int iNumber; 這樣的命名方法,在前面+i來方便你認為他是個整型,不過很多編輯器在你輸入變數後滑鼠懸停會有類型提示,有點多此一舉。。。
你問的問題我沒有搞清楚你要問什麼,描述不是很清楚。。。
8. 關鍵字和一般標識符的區別
一、主體不同
1、關鍵字:屬於保留字,是整個語言范圍內預先保留的標識符。
2、一般標識符:用戶編程時使用的名字,用於給變數、常量、函數、語句塊等命名,以建立起名稱與使用之間的關系。
二、特點不同
1、關鍵字:不能聲明與關鍵字同名的標識符。
2、一般標識符:由字母和數字以及其它字元構成。
三、規則不同
1、關鍵字:經過預處理後,關鍵字從預處理記號(preprocessing-token)中區別出來,剩下的標識符作為記號(token),用於聲明對象、函數、類型、命名空間等。
2、一般標識符:長度是由機器上的編譯系統決定的,一般的限制為8字元。
9. 請問C語言中的字元哪些可以做為變數,哪些不可以做為變數
1,變數名必須由字母、數字、下劃線組成2,首字元不能是數字3,不能太長,具體長度限制由編譯器設定,太長會被編譯器截取前面的,如果定義的兩個變數,在編譯器可識別的范圍相同,而後面的不同,編譯器將視為同一個變數。4,不能是C的保留字,如if,for,main,break不能作為變數名