1. 程式人生 > >C++ Primer 學習(第四章)

C++ Primer 學習(第四章)

1.左值和右值

C++中可以這樣簡單的理解左值和右值:能夠取地址的、有名字的就是左值,反之,不能取地址的、沒有名字的就是右值。當一個物件被用作右值的時候,用的是物件的值(內容);當物件被用作左值的時候,用的是物件的身份(在記憶體中的位置)。一個重要的原則是在需要右值的地方可以用左值來代替,但是不能把右值當成左值(也就是位置)使用。當一個左值被當成右值使用時,實際使用的是它的內容(值)。

2.C++中整除:(-m)/n和m/(-n)都等於-(m/n)。

取餘運算:如果%左邊的運算元為負數時,結果為負數或0;如果%左邊的運算元為正數時,結果為正數或0

例如:

21/-5;//結果為-4,即-(21/5)=-4
-21/5;//結果為-4,即-(21/5)=-4
-21%-8;//結果為-5,而不是3
21%-8;//結果為5,而不是-3

3.因為後置遞增運算子的優先順序高於解引用運算子,所以*p++等價於*(p++)

因為解引用運算子的優先順序低於點運算子,所以執行解引用運算的子表示式兩端必須加上括號。例如:

*p.size();//錯誤,p是一個指標,它沒有名為size的成員

4.條件運算子的優先順序非常低,因此當一條長表示式中嵌套了條件運運算元表示式時,通常需要在它兩端加上括號。

注意觀察下述程式碼:

cout<<((grade<60) ? "fail":"pass";//輸出pass或者fail
cout<<(grade<60) ? "fail":"pass";//輸出1或者0
cout<<grade<60 ? "fail":"pass";//錯誤:試圖比較cout和60

上述程式碼第2行,grade和60的比較結果是<<運算子的運算物件,因此如果grade<60為真輸出1,否則輸出0。<<運算子的返回值是cout,接下來cout作為條件運算子的條件。所以第2行程式碼等價於下述程式碼:

cout<<(grade<60);//輸出1和0
cout ? "fail":"pass";//根據cout的值是true還是false產生對應的字面值

 上述程式碼第3行等價於下述程式碼:

cout<<grade;//小於運算子的優先順序低於移位運算子,所以先輸出grade
cout < 60 ? "fail":"pass";//然後比較cout和60,錯誤