《C++ Primer》確實給我帶來了很多驚喜。
作為一本專業的具有較高門檻的"入門書",它有很多地方實在是國內的書不可及的,這不僅在於內容上的嚴謹,更表現在優秀的習題所帶給學習者的啟迪。
習題5.16
你認為為什么C++不叫做++C?
看到這個習題,頓感眼前一亮(不禁想起某些國內書籍的題目,真是平淡如水),這對於理解前自增操作與后自增操作而言着實是個好的題目。
想弄明白這個問題,就需要先理解一些基礎的概念。什么是自增操作呢?
++操作符,即自增操作符。自增操作符有兩種形式:前置操作和后置操作。前自增操作生成左值,在給操作數加1后返回改變后的操作數值。后自增操作生成右值,給操作數加1但返回未改變的操作數原值。
*事實上,因為C++具有操作符重載的功能,自增操作不僅僅可以表示加1
前置操作返回的是加1后的值,返回的是對象本身,所以這是左值。
后置操作返回的是加1前的值,其返回值可以近似的理解為與原操作數值相等的常量,所以是一個右值。
具體例子:
int i = 0, j;
j = ++i; // j = 1 , i = 1:prefix yields incremented value
j = i++; // j = 1 , i = 2:postfix yields unincremented value
附左值與右值的概念:
左值:可以出現在賦值操作左邊的值。非const左值可讀可寫。
右值:可用於賦值操作的右邊但不能用於左邊的值。右值只能讀不能寫。
左值可以出現在賦值操作右端,但右值不可以出現在賦值操作左端,將后自增操作置於賦值操作左端將會出現編譯錯誤。
另外需要注意:
由於后置操作符要返回未加1前的值作為操作的結果,所以必須要保存操作數原來的值,對於比較復雜的類型,這種額外工作可能會花費更大的代價。
建議:只有在必要時才使用后置操作符。
最后,讓我們用全新的角度去審視C++的命名原因
C++之名是Rick Mascitti在1983年夏天定名的(參見The C++ Programming Language(Special Edition)1.4節),C說明它本質上是從C語言演化而來的,“++”是C語言的自增操作符。C++語言是C語言的超集,是在C語言基礎上進行的擴展(引入了new、delete等C語言中沒有的操作符,增加了面向對象程序設計的直接支持,等等),是先有C語言,再進行++。根據自增操作符前、后置形式的差別,C++表示對C語言進行擴展之后,還可以使用C語言的內容;而寫成++C則表示無法再使用C的原始值了,也就是說C++不能向下兼容C了,這與實際情況不符。
如果以后有人問你這個問題,你會回答了嗎?:)