詳解C++編程中表達式的語義與盤算次序。本站提示廣大學習愛好者:(詳解C++編程中表達式的語義與盤算次序)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++編程中表達式的語義與盤算次序正文
表達式依據其運算符的優先級和分組來盤算。
盤算次序
請看以下示例:
// expre_pluslang__pluslang_Order_of_Evaluation.cpp // compile with: /EHsc #include <iostream> using namespace std; int main() { int a = 2, b = 4, c = 9; cout << a + b * c << "\n"; cout << a + (b * c) << "\n"; cout << (a + b) * c << "\n"; }
38 38 54
表達式盤算次序
上圖中顯示的表達式的盤算次序取決於運算符的優先級和聯系關系性:
乘法 (*) 在此表達式中具有最高優先級;是以子表達式 b * c 起首盤算。
加法 (+) 具有第二高的優先級,是以,a 將與 b 和 c 的乘積相加。
左移 (<<) 在此表達式中具有最低的優先級,但有兩個婚配項。因為左移運算符從左到右分組,是以先盤算左子表達式,再盤算右子表達式。
當應用括號為子表達式分組時,它們將更改表達式的盤算優先級溫柔序,以下圖所示。
帶括號的表達式盤算次序
相似於上圖的表達式的盤算純潔是為了展現反作用 - 在本例中是將信息轉移到尺度輸入裝備。
表達式中的表現法
在指定操作數時,C++ 說話指定某些兼容性。下表顯示須要類型為 type 的操作數的運算符可接收的操作數的類型。
運算符可接收的操作數類型
HHHHHHHHHHHHHHHHHHH1
不明白的表達式
某些表達式的意義不明白。當在統一表達式中屢次修正對象的值時,這些表達式最多見。當說話沒有界說表達式的盤算次序時,這些表達式依附於特定的次序盤算。請看上面的示例:
int i = 7; func( i, ++i );
C++ 說話不包管盤算函數挪用的參數的次序。是以,在後面的示例中,func 的參數可以接收值 7 和 8 或 8 和 8,取決於參數是從左到右照樣從右到左盤算。
C++ 序列點(Microsoft 公用)
在持續的“序列點”之間,表達式只能修正對象的值一次。
C++ 說話界說以後未指定序列點。Microsoft C++ 對觸及 C 運算符但不觸及重載運算符的任何表達式應用與 ANSI C 雷同的序列點。當重載運算符時,語義從運算符排序更改成函數挪用排序。Microsoft C++ 應用以下序列點:
邏輯“與”運算符 (&&) 的左操作數。完整盤算邏輯“與”運算符的左操作數,並在持續之前完成一切反作用。不包管必定管帳算邏輯“與”運算符的右操作數。
邏輯“或”運算符 (||) 的左操作數。完整盤算邏輯“或”運算符的左操作數,並在持續之前完成一切反作用。不包管必定管帳算邏輯“或”運算符的右操作數。
逗號運算符的左操作數。完整盤算逗號運算符的左操作數,並在持續之前完成一切反作用。一直盤算逗號運算符的兩個操作數。
函數挪用運算符。盤算函數挪用表達式和函數的一切參數(包含默許參數),並在進入函數之前完成一切反作用。在參數或函數挪用表達式之間沒有指定的盤算次序。
前提運算符的第一個操作數。完整盤算前提運算符的第一個操作數,並在持續之前完成一切反作用。
完全的初始化表達式的末尾,如聲明語句中的初始化的末尾。
表達式語句中的表達式。表達式語句由可選表達式後跟分號 (;) 構成。表達式為其反作用完整盤算。
選擇(if 或 switch)語句中的掌握表達式。完整盤算該表達式,並在履行依附於選擇的代碼之前完成一切反作用。
while 或 do 語句的掌握表達式。完整盤算該表達式,並在履行 while 或 do 輪回的下一次迭代中的任何語句之前完成一切反作用。
for 語句的一切三個表達式。完整盤算每一個表達式,並在挪動到下一個表達式之前完成一切反作用。
return 語句中的表達式。完整盤算該表達式,並在掌握權前往到挪用函數之前完成一切反作用。