對於c語言和c++熟悉的人都知道 const 這個修飾符的存在。在很多面試公司中,const 這個修飾符的面試題筆試題也是一直都有的,那對於const這個修飾符你真的了解嗎?
問到const 這個修飾符的用處,很多人都會說,用const修飾符修飾的變數表示該變數是常亮,是唯讀的,無法修改的。其實對於這樣的回答,是不準確的。
在c語言中,用const修飾的變數,其本質上還是個變數,只是它不允許作為左值存在,也就是不法對該變數進行直接賦值修改該變數,但是這不意味著該變數的值就無法修改。下面我們看一下這段**:
#include int main()
用gcc編譯器編譯執行後得到的結果是:
a = 5
a = 10
從這個結果中我們也可以看出,const修飾的變數的值在c語言中並非是無法修改的,我們可以通過指標來修改該變數的值。
#include int main()
用g++編譯器編譯執行後得到的結果是:
a = 5
a = 5
這也就是說,相同的**,用c語言和c++編譯器編譯執行後得到的結果卻不相同。
其實在c++中 ,在編譯的時候,當碰到用const修飾的變數時,編譯器是直接將變數的值和變數的符號對應起來一起存到符號表中,例如const int a = 5;在符號表中就會將a和5對應起來,在編譯的過程中,當碰到printf(「a = %d\n」,a);時,為用5直接將a替換掉。在c++中,編譯器不會為a分配儲存空間,在c語言中就會為a分配儲存空間,所以在c編譯器中,就可以通過指標來改變用const修飾的變數。
我們再看一下下面的**:
#include int main()
我們只是在**中列印了指著p和a的位址,用c語言和c++的編譯器編譯執行之後,答應出來的位址p和a都是相同的。這是可能你會說,在c++中不是說不會為a分配位址嗎?怎麼執行後位址p和a都是相同的?
在c++中,編譯器不會為const變數分配空間,只會將其對應起來存到符號表中,用到變數名的時候,直接將值替換。但是在碰到int* p = (int*)&a;這條語句的時候,在碰到&a時,這個時候會為a分配儲存空間,這個時候p和a的位址相同,但是通過指標來修改a的值在c++中還是無法成功的,因為在碰到printf(「a = %d\n」,a);時,編譯器還是會直接用5將a替換,而不會去分配的儲存空間的取值。
其實在c++中,const修飾的變數,在編譯的時候如果前面有extern和取位址符&時,會為變數分配儲存空間是為了相容c語言,但是在c++中,用const修飾的變數就真的無法修改它的值,可以說是常亮。但是在c語言中,const修飾的變數本質上還是變數而不是常量。這在c語言中其實也是矛盾的,因為我們想要用const定義乙個常量,但又可以通過指標來改變該常量的值。而c++為了相容c語言,所以保留了這個特性,但是卻不法修改它的值,這就是const在c語言和c++中的區別。
在c語言中
const修飾的變數是唯讀,本質上還是乙個變數,不是真正的常量
const修飾的區域性變數在棧上分配儲存空間
const修飾的全域性變數在唯讀儲存區中分配儲存空間
const在只在編譯期有用,在執行的時候沒有用
在c++中
const修飾的變數是常量放在符號表中,在編譯的過程中,如果發現常量,則直接以符號表中的值進行替換。
在編譯的過程中,如果發現以下情況,則為常量分配儲存空間:
對const常量使用了extern;
對const常量使用了取位址符&。
在這兩種情況下,雖然會為常量分配儲存空間,但是卻不會使用該儲存空間中的值。
const在C語言和C 中的區別
const在c語言和c 中的對比一 const在c語言和c 中的對比二 下面這段 在c語言中和c 中表現出不同結果 int main 環境 c語言中 c 中 結果20 10c 中的10對嗎?如果你認為沒有被修改,那麼你就錯了,這裡的10是錯誤的,printf列印的時候是在暫存器上獲取的,而記憶體中的...
const 在C語言和C 語言中的區別
const 在c語言和c 語言中的區別 1 c語言中的 const 是定義了乙個 const 變數,const 用來限定乙個變數是唯讀的,不具備寫的功能,即是不可變的 c 語言中的 const 則是定義了乙個常量 const int a 10 int arr a 在c語言中是錯誤的,因為在c語言中是...
c語言和c 中struct的區別
1.雖然長的一樣,但是本質上型別不同 c語言中 struct是使用者自定義資料型別 udt c 中struct是抽象資料型別 adt 所以下面 struct he 在c裡面實際上資料型別為 struct he 所以定義乙個結構he變數都要 帶上struct.structhe a c語言 變數方式 而...