都說C++是C語言的升級版
但C可就不服了
憑啥多了兩個+號就比我強?
C語言/C++
那問題在於C語言和C++技術哪家強?比比就知道啦,今天我們就隆重邀約兩位大佬同台PK,為了此次PK,專門設置了7個環節,這7個語法細節,估計這裡不說,你可能都很難發現。
1.變量聲明
在C語言中,變量的使用需要進行前置聲明。
C++ 強調的是實用性,可以在需要使用的時候再定義
例如我們經常用到的for循環的變量定義:
C語言/C++
2.register關鍵字
在C語言中,register關鍵字用於將局部變量存儲到寄存器中去。
C++中依然支持register關鍵字,但是它有自己的優化策略,即使不加register,編譯器也會自動判斷是否需要將變量放入寄存器中,register關鍵字只能起到申請的作用,具體能不能到寄存器中,編譯器自有判斷。
總之,在C++中可以廢除register關鍵字的使用了!
C語言/C++
3.變量名限制
在C語言中,定義多個同名變量是合法的,這些全局變量最終都被連結到全局存儲區的同一地址空間
這點有點不可思議吧,其實這個問題不僅在C語言出現,包括目前前端界的大佬——javascript也有這種現象!
在C++中,不允許定義多個同名變量
C語言/C++
4.const關鍵字
C語言對const關鍵字的理解只能是只讀變量
C++對const理解才是真正意義上的常量。
為什麼這麼說,對const關鍵字理解,在這裡就不得不花點篇幅來探討一下了,先來看下面的案例,感受一下同樣的代碼,為啥在不同環境得到的結果會不一樣:
C語言/C++
這段代碼的原理和之前講述封裝性一樣,我們不能直接修改const變量的值,但是可以試圖通過指針這個工具,騙過編譯器的語法檢查,最終能否修改到const變量的值呢?
C編譯器成功被「騙」了,而C++編譯器卻沒有,這說明了什麼呢?
這裡就要先解釋一下,什麼才叫真正意義上的常量,在內存空間中,確實是有一塊常量存儲區專門保存常量值的,作業系統也會對該區域進行管理,不允許程序做任何修改。那怎樣的變量會落入這塊區域呢?只有代碼中的字面量,才會成為常量存入這塊區域內,那也就是說,真正意義上的常量,只能是硬編碼寫死的那些字面量了!
C語言/C++
(嘗試修改常量值,發生棧錯誤)
如此一來,C++編譯器到底是如何將const變量變成真正意義上的常量呢?那麼只有一種可能,就是轉化為字面量了!到底是不是這樣呢?我們再來看一個現象:
C語言/C++
可以發現C認為const變量仍然是變量,因此不能初始化數組大小,而C++ 則會將其轉為字面量,因此可以初始化數組大小了。
C++ 在編譯const的時候,會生成一個常量表,專門用於記錄常量,在往下編譯的過程中,發現使用變量的地方恰好在常量表裡面有定義,會將const變量改為字面量,從而成為真正意義上的常量了!
C語言/C++
C語言/C++
(1).具有volatile修飾的變量
volatile含義即告知編譯器不要對該變量進行優化,這種屬於自我放棄,可以理解
C語言/C++
(2).作為類成員變量或靜態變量的情況
類作為抽象意義存在,本身不能給成員變量賦初值,因此這種情況就屬於強人所難了。先來看作為成員變量的情況,作為靜態變量的情況分析,那就得放另外一篇單獨來說
C語言/C++
對此,也不能為難編譯器了,因為編譯器在編譯const變量時並不知道具體值,常量的具體值要等對象創建出來才知道,因此就無法生成常量表,也就只能當只讀變量來看待啦!
C語言/C++
好了,花了點篇幅,把常量講了一通,回過頭來繼續吧:
5.struct類型
在C語言中struct是一個結構體,聲明需要帶上struct關鍵字。
在C++中struct就是個類,直接用類名聲明即可。
C語言/C++
6.函數類型
在C語言中,函數參數和返回值什麼都不寫,默認返回int類型,接受任意參數。
在C++中不允許這樣,參數列表不寫就是void,返回值類型不允許不寫!
C語言/C++
7.三目運算符
在C語言中,三目運算符是不能作為左值的。
在C++中,三目運算符可以作為左值使用,但是如果可能的返回值有一個是常量,就不能作為左值了。
C語言/C++
好了,這7個語法細節內容也就到這裡了,當然C++在升級的過程中肯定也不止這麼7個細節,不過即使不知道,但也足夠你用了!
C語言/C++
加C/C++學習交.流群獲取C語言、C++、Windows高級編程,MFC框架編程、QT框架編程,Linux應用程式開發,Linux內核研究等系統學習路線,更有進階乾貨的直播免費學習權限 ,都是大牛帶飛 讓你少走很多的彎路的 群...號是 546912356