面試時,問及const的含義,很多人會答:"const表示常量",這可不是考英文翻譯,const應該更近似"唯讀"而不是常量。
const語法
對非指標變數,const無論放在型別前或後,都表示變數屬性為唯讀,執行過程中不能也不會賦值修改。如const int a;和int const a;這兩種方式const作用相同,都表示a是乙個常整型數。
而const修飾指標時則有所不同,分三種情況:const int *a; int * const a; const int const * a;
const int* a表示a是指向唯讀整型數的指標,即記憶體*a中的整數唯讀,不能被修改,但指標a可以指向其它位址。
int* const a;表示a是指向整型數的唯讀指標,即:指標指向的整型數可修改,但指標a本身不能修改,不能再指向其他位址。
const int const * a;表示a是指向唯讀整型數的唯讀指標,指標指向的整型數不可修改,指標也不可修改。
有人會有疑問,變數或指標是否修改由程式設計師自己控制,即使不用const也不影響程式功能實現,為什麼要引入它呢?
const的作用
1) const對外傳達有用資訊,某變數為const表明在後續**中不會被修改。所以**裡合理加入const能提高可讀性,當然前提是要能看得懂這個暗示,否則就是對牛彈琴了。
2) const能借助編譯器保護那些不希望被改變的變數,防止誤修改。一旦宣告為const,後面**中如果試圖修改,編譯器會報錯提醒。這樣可以減少bug,提高穩定性。
3) const可以給編譯器一些附加資訊,使它產生更高效的優化**。編譯器如果知道某變數唯讀,值不會改變,就可以利用這一點有針對性做一些優化。
4) 某些編譯器不支援rwdata段(即不支援全域性變數),可用const把全域性資料定位到rodata段。另外rodata段的資料可直接在多程序間共享,提高空間利用率且無需同步。
const與常量
回到開始的問題,const和常量是否一回事?不是。常量沒有儲存空間,是右值。而const的修飾物件依然是左值,有儲存空間,只不過被限定到唯讀空間,這和常量有本質不同。c89中左值定義:「物件是乙個命名的儲存區域,左值是引用某個物件的表示式」。也就是說有具體儲存空間的物件的表示式,就是乙個左值!比如const修飾的變數是左值,而相對的,陣列名是右值。
另外為防止指標指向的常量被「曲線」修改,c對於指標間賦值有乙個規定:左值必須包含右值所有的限定詞。這就限定指向const物件的指標不能賦給指向非const物件的指標,反過來允許。這理所當然,要不,換個指標就能修改原來定義為const的資料:
const int *p1 =10;
int *p2;
p2 = p1; //這種賦值被禁止,想來也是,制定c標準不可能留下這麼大個漏洞
*p2 = 100;
總結:**裡看到const就象開車看到了單行道標誌,利用好它會感覺順暢,否則會覺得被束縛。一般來說,只要能確定元素為唯讀,const有益無害。
補遺篇之static
static的作用是it公司c語言筆試必考題,看似簡單卻少有人能完整回答。因為它不止乙個作用,並且隨修飾物件的不同而變化,這裡我總結成 有限生命變無限,無限空間變有限 static有三類作用物件 函式 區域性變數和全域性變數。其中區域性變數只在函式執行期間存活,即 有限生命 而函式和全域性變數的作用...
終於懂得孤獨是躲不開的單行道
6,7年前,當我還是個中學生的時候,每當晚上做完作業,看不進書時,都喜歡開啟收音機,聽著裡面主播精選的情歌,或傷感或歡快。主持人和嘉賓講述自己的生活 故事 還有情感困擾,我靜靜聆聽,就好像看著另一頭的世界。多彩 豐富 新鮮,充滿了跌宕起伏,還有愛恨離別。而我總是這樣聽著,那時候除非放假回老家,不然都...
牌蜂箱 益精單行道脫粉蜂箱全面上市了(1)
益精牌單行道脫粉蜂箱經過6年的研發與實驗,已達到了預期的效果,現已向市場全面推廣。益精單行道脫粉蜂箱 益精單行道脫粉蜂箱,是一款享有四重專利保護,在國內首次提出單行道蜂箱理念並運用該理念設計生產的脫粉蜂箱。此款脫粉蜂箱蜜蜂由巢門進入,脫粉後從上平面的出蜂口直接飛出,蜜蜂進出自如,有效避免蜂群在巢門擁...