在本教程中,我們將借助示例來了解C ++中運算符的優(yōu)先級和關聯(lián)性。
如果單個表達式中有多個運算符,則不會同時評估這些運算。 相反,具有較高優(yōu)先級的運算符將首先對其操作進行評估。
讓我們看一個實例:
int x = 5 - 17 * 6;
在此,乘法運算符 * 的優(yōu)先級高于減法運算符 - 。因此,17 * 6首先進行評估。
結果,以上表達式等效于
int x = 5 - (17 * 6);
如果我們想先進行評估5 - 17,則必須將它們放在括號內:
int x = (5 - 17) * 6;
#include <iostream> using namespace std; int main() { // 首先評估17 * 6 int num1 = 5 - 17 * 6; //與num1等效的表達式 int num2 = 5 - (17 * 6); //強制編譯器首先評估5-17 int num3 = (5 - 17) * 6; cout << "num1 = " << num1 << endl; cout << "num2 = " << num2 << endl; cout << "num3 = " << num3 << endl; return 0; }
輸出結果
num1 = -97 num2 = -97 num3 = -72
注意:由于C ++中有很多運算符具有多個優(yōu)先級,因此強烈建議我們使用括號使代碼更具可讀性。
下表顯示了C ++運算符的優(yōu)先級。優(yōu)先級1表示優(yōu)先級最高的運算符,而優(yōu)先級17表示優(yōu)先級最低的運算符。
優(yōu)先級 | 運算符 | 描述 | 結合律 |
---|---|---|---|
1 | :: | 作用域 | 從左至右 |
2 | a++ a-- type( ) type{ } a( ) a[ ] . -> | 后綴/后綴增量 后綴/后綴減量 函數(shù)風格轉型 函數(shù)風格轉型 函數(shù)調用下標 從對象訪問成員 從對象ptr訪問成員 | 從左至右 |
3 | ++a --a +a -a ! ~ (type) *a &a sizeof co_await new new[ ] delete delete[] | 前綴增量 前綴減量 正 負 邏輯非 按位非 C風格轉型 間接(解引用) 取地址 取大小 await表達式 動態(tài)內存分配 動態(tài)內存釋放 | 從右至左 |
4 | .* ->* | 成員對象選擇器 成員指針選擇器 | 從左至右 |
5 | a * b a / b a % b | 乘 除 取模 | 從左至右 |
6 | a + b a - b | 加 減 | 從左至右 |
7 | << >> | 按位左移 按位右移 | 從左至右 |
8 | <=> | 三向比較運算符 | 從左至右 |
9 | < <= > >= | 小于 小于或等于 大于 大于或等于 | 從左至右 |
10 | == != | 等于 不相等 | 從左至右 |
11 | & | 按位與 | 從左至右 |
12 | ^ | 按位異或 | 從左至右 |
13 | | | 按位或 | 從左至右 |
14 | && | 邏輯與 | 從左至右 |
15 | || | 邏輯或 | 從左至右 |
16 | a ? b : c throw co_yield = += -= *= /= %= <<= >>= &= ^= |= | 三元條件運算 throw 運算符 yield 表達式(C++ 20) 賦值 加法賦值 減法賦值 乘法賦值 除法分配 模數(shù)賦值 按位左移賦值 按位右移賦值 按位與賦值 按位異或賦值 按位或賦值 | 從右至左 |
17 | , | 逗號運算符 | 從左至右 |
關聯(lián)性的屬性將在稍后討論。
運算符的關聯(lián)性是計算表達式的方向。例如,
int a = 1; int b = 4; // a = 4 a = b;
請看a=4;語句。 = 運算符的關聯(lián)性是從右到左。 因此,b的值被賦值給a。
同樣,多個運算符可以具有相同的優(yōu)先級(如上表所示)。在表達式中使用相同優(yōu)先級的多個運算符時,將根據它們的關聯(lián)性對它們進行求值。
int a = 1; int b = 4; b += a -= 6;
運算符+=和-=運算符具有相同的優(yōu)先級。由于這些運算符的關聯(lián)性是從右到左,因此這是最后一條語句的求值方式。
a -= 6 首先評估。因此,a將為-5
然后,b += -5將被評估。因此,b將為-1
#include <iostream> using namespace std; int main() { int a = 1; int b = 4; // a -= 6 首先進行評估 b += a -= 6; cout << "a = " << a << endl; ; cout << "b = " << b; }
輸出結果
a = -5 b = -1