|
問題:const變量 & 常量 為什么我象下面的例子一樣用一個const變量來初始化數(shù)組,ANSI C的編譯器會報告一個錯誤呢? const int n = 5; int a[n]; 答案與分析: 1)、這個問題討論的是“常量”與“只讀變量”的區(qū)別。常量肯定是只讀的,例如5, “abc”,等,肯定是只讀的,因為程序中根本沒有地方存放它的值,當然也就不能夠去修改它。而“只讀變量”則是在內(nèi)存中開辟一個地方來存放它的值,只不過這個值由編譯器限定不允許被修改。C語言關鍵字const就是用來限定一個變量不允許被改變的修飾符(Qualifier)。上述代碼中變量n被修飾為只讀變量,可惜再怎么修飾也不是常量。而ANSI C規(guī)定數(shù)組定義時維度必須是“常量”,“只讀變量”也是不可以的。 2)、注意:在ANSI C中,這種寫法是錯誤的,因為數(shù)組的大小應該是個常量,而const int n,n只是一個變量(常量 != 不可變的變量,但在標準C++中,這樣定義的是一個常量,這種寫法是對的),實際上,根據(jù)編譯過程及內(nèi)存分配來看,這種用法本來就應該是合理的,只是ANSI C對數(shù)組的規(guī)定限制了它。 3)、那么,在ANSI C 語言中用什么來定義常量呢?答案是enum類型和#define宏,這兩個都可以用來定義常量。 用volatile修飾的變量可以防止被編譯器優(yōu)化 一般說來,volatile用在如下的幾個地方: 1、中斷服務程序中修改的供其它程序檢測的變量需要加volatile; 2、多任務環(huán)境下各任務間共享的標志應該加volatile; 3、存儲器映射的硬件寄存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義; 另外,以上這幾種情況經(jīng)常還要同時考慮數(shù)據(jù)的完整性(相互關聯(lián)的幾個標志讀了一半被打斷了重寫),在1中可以通過關中斷來實現(xiàn),2中可以禁止任務調(diào)度,3中則只能依靠硬件的良好設計了。
|
|
|