程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C中const的實現機制

C中const的實現機制

編輯:關於C

同學去參加筆試,遇到一個關於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做修改完全可以,因此該段代碼編譯可以通過,也可以成功運行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved