萬盛學電腦網

 萬盛學電腦網 >> 網頁制作 >> Html5 >> C++的表達式詳解

C++的表達式詳解

下面是C++的表達式詳解

1,應該把函數調用當作是一種運算符,這種運算符對參與運算的對象沒有數量限制。

2,關於“左值(lvalue)”和“右值(rvalue)”可以做一個簡單的歸納:當一個對象被用作右值的時候,用的是對象的值(內容);當對象被用作左值的時候,用的是對象的身份(在內存中的位置)。 更具體的左值與右值的舉例:C++ priemr 5ed P121

3,運算符的優先級規定了運算對象的組合方式,但是沒有說明運算對象按照什麼順序求值,在大多數的情況下,不會明確求值的順序,比如對於下面的表達式: int i= f1() + f2(); 先調用f1還是先調用f2是未知的。因此,對於這種運算符來說避免多個運算對象共同修改同一個變量,如下面的代碼中,最終輸出是未能確定的: int i=0; cout<< i << "" << ++i << endl; // 未定義 但C++中有4種運算符是明確規定了運算對象的求值順序的:邏輯與“&&”、邏輯或"||"、條件(?:)運算符、逗號運算符","。這也是為什麼在我們自己定義的類類型中,一般不會去重載這幾種操作符。

4,短路求值:邏輯與運算符和邏輯或運算符都是先求左側運算對象的值再求右側運算對象的值,當且僅當左側運算對象無法確定表達式的結果時才會計算右側運算對象的值。

5,區別i++與++i 後置操作符需要先保存原來的值,再將i+1,然後返回原來的值的副本;而前置操作符,只需要在原來值上加1,然後返回。所以++i比i++效率更高,當然如果i為int類型或指針時,編譯器會對i++進行優化,但如果是其他類類型或復雜類的迭代器時就不會了。

6,注意解除引用操作符與++操作符的優先級,在實際代碼中為了簡潔經常將*(i++)寫為*i++。因為++的優先級高於解除引用操作符。

7,在使用條件操作符時,盡量避免寫出深度嵌套的條件操作符。另外條件操作符的優先級非常低,在表示式中使用時要注意加括號,比如:cout<<(i<j?i:j);

8,關於sizeof運算符。sizeof的運算結果是編譯時的常量,注意下面的代碼的值: 1 int a[10]; 2 int* p = a; 3 int n1 = sizeof(a) / sizeof(*a); // n1=10 4 int n2 = sizeof(p) / sizeof(*p); // n2=1 sizeof運算符小貼士: 1 對char或者類型為char的表達式執行sizeof運算,結果為1。 2 對引用類型執行sizeof運算得到被引用對象年占空間的大小。 3 對指針執行sizeof運算得到指針本身所占空間的大小。 4 對解引用指針執行sizeof運算得到的指針指向的對象所占空間的大小,指針不需要有效。 5 對數組執行sizeof運算得到的整個數組所占空間的大小,等價於對數組中所有的元素各執行一次sizeof運算並將所得結果求和。注意sizeof運算不會把數組轉換成指針來處理。 6 對sting對象或vector對象執行sizeof運算只返回該類型固定部分的大小,不會計算對象中的元素占用了多少空間。

9,在復合表達式求值時,要特別注意運算符的優先級與結合性。特別地,!=與==的優先級小於<=,>=等關系運算符。

10,類型轉換

1)隱式轉換 下面情況下,編譯器會自動地轉換運算對象的類型:

1 在大多數表達式中,比int類型小的整數值首先提升為較大的整數類型。

2 在條件中,非布爾值轉換成布爾類型。

3 初始化過程中,初始值轉換成變量的類型;在賦值語句中,右側運算對象轉換成左側運算對象的類型。 4 如果算術運算或關系運算的運算對象有多種類型,需要轉換成同一種類型。 5 函數調用時,實參與形參之間的類型轉換。 6 類類型可以定義一些轉換函數。

2)顯式轉換 1 statci_cast

:任何具有明確定義的類型轉換,只要不包含底層const 2 const_cast:只能改變運算對象底層const 3 reinterpret_cast:通常為運算對象的位模式提供較底層次上的重新解釋。

4 dynamic_cast:運行時類型識別。

以上就是我們給大家介紹的C++的表達式詳解,希望大家繼續關注本網站。

copyright © 萬盛學電腦網 all rights reserved