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