昨天有個學(xué)生去做C/C++軟件工程師的筆試題,遇到了這么一個題目,來問我結(jié)果是多少?

看似非常普通的一道C語言題目,如果不指定編譯器,還真不知道結(jié)果是多少。
不信我來演示給你看下。
首先是用gcc來編譯,就是C語言的編譯器,語法沒有問題,運行結(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é)果上卻不同。
其實說兼容當然是沒問題的,只是C語言和C++中const的作用不同。
C語言中,const修飾的是只讀變量,意思是不能通過變量本身去修改對應(yīng)內(nèi)存的值,但是可以通過其他方式去修改,比如指針。代碼中確實也是通過指針來修改的,所以num對應(yīng)的那塊內(nèi)存值變了。
但是在C++中,const修飾的就是一個常量,跟define定義的宏有點類似,它存放在符號表中,接下來只要遇到這個常量,直接就是替換。
那么問題就來了,既然它沒有存放在內(nèi)存中,為什么代碼中還能對他進行取地址的操作。
這一點主要還是為了兼容C語言,強行對它取地址,編譯器會分配一塊內(nèi)存,并且把常量的值填在內(nèi)存里面,然后取這塊內(nèi)存的地址進行運算。但是整個過程并不會影響常量的屬性,代碼下面遇到,還是直接替換。
const在C++中還有很多用處,修飾成員變量、修飾成員函數(shù),所以學(xué)完了C語言,如果有精力,可以去看看C++,不為別的,學(xué)習(xí)C++可以更好的理解C語言。
審核編輯 :李倩
-
C語言
+關(guān)注
關(guān)注
183文章
7644瀏覽量
145569 -
C++
+關(guān)注
關(guān)注
22文章
2123瀏覽量
77110 -
CONST
+關(guān)注
關(guān)注
0文章
45瀏覽量
8761
原文標題:同樣是const,為什么結(jié)果不一樣?
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
為什么labview公式節(jié)點內(nèi)不同的公式形式結(jié)果不一樣呢?
為什么同一個電路,同樣的參數(shù),每次的仿真結(jié)果為什么會不一樣,頭疼
請問使用ActiveX需要注意什么嗎?為什么兩個同樣程序框圖的vi,運行結(jié)果不一樣?
程序編輯器結(jié)果不一樣
請問keil5代碼一樣但運行結(jié)果不一樣是怎么回事?
這個仿真例程設(shè)置的參數(shù)一樣,為何會出現(xiàn)不一樣的仿真結(jié)果?
freeRtos和裸機 跑同樣一個程序,效率不一樣
同樣的電機,電壓等級、功率等都一樣,為什么電機的勵磁電壓不一樣呢?
在車輛自燃方面,電動汽車和燃油汽車有什么不一樣
電容容量一樣大小不一樣能用嗎
不同芯片的DMA(Direct Memory Access)是不一樣的
不一樣的展會,不一樣的精彩:2025灣芯展順利收官
不一樣的展會,不一樣的精彩 2025灣芯展圓滿收官
同樣是const,為什么結(jié)果不一樣?
評論