同學去參加筆試,遇到一個關於const的問題,大致如下:
有如下代碼,問該段代碼是否可以編譯通過,是否可以運行,運行結果是什麼。
[cpp]
const int a = 1;
int* b = (int*)&a;
*b = 31;
以上代碼是可以編譯通過並且能夠成功運行的,運行後a b的值均為31。
這道題的關鍵在於C語言中const的實現機制。在C中,const修飾的變量不能夠被修改,在反匯編後,有const修飾的變量和沒有const修飾的變量的結果是一樣的。但是如果在程序中對const變量進行修改,編譯時就會報錯,如:
[cpp]
const int a = 1;
a = 2;
這段代碼編譯時就會報錯,error C2166: l-value specifies const object。
那麼,C到底是如何實現const的呢。www.2cto.com
在最初的C標准中,並沒有const,只是在有了C++後,才將const加入C的標准中。而實際上C對const變量並沒有做過多的處理,編譯後const和普通變量沒有區別,只是在編譯的過程中,編譯器會檢查代碼中是否有對const變量進行修改的代碼,如果有則向用戶報錯。在編譯過後,const變量就和普通變量相同了。而且,如果使用memset去修改const變量的內容,也完全沒有問題,這就可以看出const修飾是屬於編譯層面的限制,一般不會涉及到運行層面。在C中,const是用於明確的標識出變量或者函數不能被修改,而且這種限制在編譯層面進行約束。
因此在最初那道題,a是const變量,整個代碼段沒有對a進行修改,因此編譯可以通過,編譯通過後a和普通變量相同,變量b做修改完全可以,因此該段代碼編譯可以通過,也可以成功運行。