昨天有個學(xué)生去做C/C++軟件工程師的筆試題,遇到了這么一個題目,來問我結(jié)果是多少?
看似非常普通的一道C語言題目,如果不指定編譯器,還真不知道結(jié)果是多少。
不信我來演示給你看下。
首先是用gcc來編譯,就是C語言的編譯器,語法沒有問題,運(yùn)行結(jié)果,num = 2。
root@Turbo:test# gcc test.c -o test
root@Turbo:test# 。/test
num = 2
root@Turbo:test#
同樣的代碼,換成g++來編譯,就是C++的編譯器,結(jié)果是num = 1。
root@Turbo:test# g++ test.c -o test
root@Turbo:test# 。/test
num = 1
root@Turbo:test#
都說C++是兼容C語言的,為什么在處理結(jié)果上卻不同。
其實說兼容當(dāng)然是沒問題的,只是C語言和C++中const的作用不同。
C語言中,const修飾的是只讀變量,意思是不能通過變量本身去修改對應(yīng)內(nèi)存的值,但是可以通過其他方式去修改,比如指針。代碼中確實也是通過指針來修改的,所以num對應(yīng)的那塊內(nèi)存值變了。
但是在C++中,const修飾的就是一個常量,跟define定義的宏有點類似,它存放在符號表中,接下來只要遇到這個常量,直接就是替換。
那么問題就來了,既然它沒有存放在內(nèi)存中,為什么代碼中還能對他進(jìn)行取地址的操作。
這一點主要還是為了兼容C語言,強(qiáng)行對它取地址,編譯器會分配一塊內(nèi)存,并且把常量的值填在內(nèi)存里面,然后取這塊內(nèi)存的地址進(jìn)行運(yùn)算。但是整個過程并不會影響常量的屬性,代碼下面遇到,還是直接替換。
const在C++中還有很多用處,修飾成員變量、修飾成員函數(shù),所以學(xué)完了C語言,如果有精力,可以去看看C++,不為別的,學(xué)習(xí)C++可以更好的理解C語言。
審核編輯 :李倩
-
C語言
+關(guān)注
關(guān)注
180文章
7598瀏覽量
136197 -
C++
+關(guān)注
關(guān)注
22文章
2104瀏覽量
73494 -
CONST
+關(guān)注
關(guān)注
0文章
44瀏覽量
8148
原文標(biāo)題:同樣是const,為什么結(jié)果不一樣?
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論