C++運(yùn)算符優(yōu)先級(jí),是描述在計(jì)算機(jī)運(yùn)算計(jì)算表達(dá)式時(shí)執(zhí)行運(yùn)算的先后順序。 先執(zhí)行具有較高優(yōu)先級(jí)的運(yùn)算,然后執(zhí)行較低優(yōu)先級(jí)的運(yùn)算。 例如,我們常說的先執(zhí)行相乘和除,再執(zhí)行加減運(yùn)算。
| 優(yōu)先級(jí) | 運(yùn)算符 | 說明 | 結(jié)合性 |
|---|---|---|---|
| 1 | :: | 范圍解析 | 自左向右 |
| 2 | ++ -- | 后綴自增/后綴自減 | |
| () | 括號(hào) | ||
| [] | 數(shù)組下標(biāo) | ||
| . | 成員選擇(對(duì)象) | ||
| ?> | 成員選擇(指針) | ||
| 3 | ++ -- | 前綴自增/前綴自減 | 自右向左 |
| + ? | 加/減 | ||
| ! ~ | 邏輯非/按位取反 | ||
| (type) | 強(qiáng)制類型轉(zhuǎn)換 | ||
| * | 取指針指向的值 | ||
| & | 某某的地址 | ||
| sizeof | 某某的大小 | ||
| new,new[] | 動(dòng)態(tài)內(nèi)存分配/動(dòng)態(tài)數(shù)組內(nèi)存分配 | ||
| delete,delete[] | 動(dòng)態(tài)內(nèi)存釋放/動(dòng)態(tài)數(shù)組內(nèi)存釋放 | ||
| 4 | .* ->* | 成員對(duì)象選擇/成員指針選擇 | 自左向右 |
| 5 | * / % | 乘法/除法/取余 | |
| 6 | + ? | 加號(hào)/減號(hào) | |
| 7 | << >> | 位左移/位右移 | |
| 8 | < <= | 小于/小于等于 | |
| > >= | 大于/大于等于 | ||
| 9 | == != | 等于/不等于 | |
| 10 | & | 按位與 | |
| 11 | ^ | 按位異或 | |
| 12 | | | 按位或 | |
| 13 | && | 與運(yùn)算 | |
| 14 | || | 或運(yùn)算 | |
| 15 | ?: | 三目運(yùn)算符 | 自右向左 |
| 16 | = | 賦值 | |
| += ?= | 相加后賦值/相減后賦值 | ||
| *= /= %= | 相乘后賦值/相除后賦值/取余后賦值 | ||
| <<= >>= | 位左移賦值/位右移賦值 | ||
| &= ^= |= | 位與運(yùn)算后賦值/位異或運(yùn)算后賦值/位或運(yùn)算后賦值 | ||
| 17 | throw | 拋出異常 | |
| 18 | , | 逗號(hào) | 自左向右 |
| 優(yōu)先級(jí) | 操作符 | 描述 | 例子 | 結(jié)合性 |
|---|---|---|---|---|
| 1 | () [] -> . :: ++ -- | 調(diào)節(jié)優(yōu)先級(jí)的括號(hào)操作符 數(shù)組下標(biāo)訪問操作符 通過指向?qū)ο蟮闹羔樤L問成員的操作符 通過對(duì)象本身訪問成員的操作符 作用域操作符 后置自增操作符 后置自減操作符 | (a+b)/4; array[4]=2; ptr->age=34; obj.age=34; Class::age=2; for(i=0;i<10;i++)... for(i=10;i>0;i--)... | 從左到右 |
| 2 | ! ~ ++ -- - + * & (type) sizeof | 邏輯取反操作符 按位取反(按位取補(bǔ)) 前置自增操作符 前置自減操作符 一元取負(fù)操作符 一元取正操作符 解引用操作符 取地址操作符 類型轉(zhuǎn)換操作符 返回對(duì)象占用的字節(jié)數(shù)操作符 | if(!done)... flags=~flags; for(i=0;i<10;++i)... for(i=10;i>0;--i)... int i=-1; int i=+1; data=*ptr; address=&obj; int i=(int)floatNum; int size=sizeof(floatNum); | 從右到左 |
| 3 | ->* .* | 在指針上通過指向成員的指針訪問成員的操作符 在對(duì)象上通過指向成員的指針訪問成員的操作符 | ptr->*var=24; obj.*var=24; | 從左到右 |
| 4 | * / % | 乘法操作符 除法操作符 取余數(shù)操作符 | int i=2*4; float f=10/3; int rem=4%3; | 從左到右 |
| 5 | + - | 加法操作符 減法操作符 | int i=2+3; int i=5-1; | 從左到右 |
| 6 | << >> | 按位左移操作符 按位右移操作符 | int flags=33<<1; int flags=33>>1; | 從左到右 |
| 7 | < <= > >= | 小于比較操作符 小于或等于比較操作符 大于比較操作符 大于或等于比較操作符 | if(i<42)... if(i<=42)... if(i>42)... if(i>=42)... | 從左到右 |
| 8 | == != | 等于比較操作符 不等于比較操作符 | if(i==42)... if(i!=42)... | 從左到右 |
| 9 | & | 按位與操作符 | flags=flags&42; | 從左到右 |
| 10 | ^ | 按位異或操作符 | flags=flags^42; | 從左到右 |
| 11 | | | 按位或操作符 | flags=flags|42; | 從左到右 |
| 12 | && | 邏輯與操作符 | if(conditionA&&conditionB)... | 從左到右 |
| 13 | || | 邏輯或操作符 | if(conditionA||conditionB)... | 從左到右 |
| 14 | ?: | 三元條件操作符 | int i=(a>b)?a:b; | 從右到左 |
| 15 | = += -= *= /= %= &= ^= |= <<= >>= | 賦值操作符 復(fù)合賦值操作符(加法) 復(fù)合賦值操作符(減法) 復(fù)合賦值操作符(乘法) 復(fù)合賦值操作符(除法) 復(fù)合賦值操作符(取余) 復(fù)合賦值操作符(按位與) 復(fù)合賦值操作符(按位異或) 復(fù)合賦值操作符(按位或) 復(fù)合賦值操作符(按位左移) 復(fù)合賦值操作符(按位右移) | int a=b; a+=3; b-=4; a*=5; a/=2; a%=3; flags&=new_flags; flags^=new_flags; flags|=new_flags; flags<<=2; flags>>=2; | 從右到左 |
| 16 | , | 逗號(hào)操作符 | for(i=0,j=0;i<10;i++,j++)... | 從左到右 |
運(yùn)算符是一種告訴編譯器執(zhí)行特定的數(shù)學(xué)或邏輯操作的符號(hào)。C++ 內(nèi)置了豐富的運(yùn)算符,并提供了以下類型的運(yùn)算符:
下表顯示了 C++ 支持的所有算術(shù)運(yùn)算符。假設(shè)變量 A 的值為 10,變量 B 的值為 20,則:
| 運(yùn)算符 | 描述 | 實(shí)例 |
|---|---|---|
| + | 把兩個(gè)操作數(shù)相加 | A+B將得到30 |
| - | 從第一個(gè)操作數(shù)中減去第二個(gè)操作數(shù) | A-B將得到-10 |
| * | 把兩個(gè)操作數(shù)相乘 | A*B將得到200 |
| / | 分子除以分母 | B/A將得到2 |
| % | 取模運(yùn)算符,整除后的余數(shù) | B%A將得到0 |
| ++ | 自增運(yùn)算符,整數(shù)值增加1 | A++將得到11 |
| -- | 自減運(yùn)算符,整數(shù)值減少1 | A--將得到9 |
算術(shù)運(yùn)算符實(shí)例:
請(qǐng)看下面的實(shí)例,了解 C++ 中所有可用的算術(shù)運(yùn)算符,復(fù)制并黏貼下面的 C++ 程序到 test.cpp 文件中,編譯并運(yùn)行程序即可。
#include <iostream> using namespace std; main() { int a = 21; int b = 10; int c ; c = a + b; cout << "Line 1 - c 的值是 " << c << endl ; c = a - b; cout << "Line 2 - c 的值是 " << c << endl ; c = a * b; cout << "Line 3 - c 的值是 " << c << endl ; c = a / b; cout << "Line 4 - c 的值是 " << c << endl ; c = a % b; cout << "Line 5 - c 的值是 " << c << endl ; c = a++; cout << "Line 6 - c 的值是 " << c << endl ; c = a--; cout << "Line 7 - c 的值是 " << c << endl ; return 0; } 當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
Line 1 - c 的值是 31 Line 2 - c 的值是 11 Line 3 - c 的值是 210 Line 4 - c 的值是 2 Line 5 - c 的值是 1 Line 6 - c 的值是 21 Line 7 - c 的值是 22 }
下表顯示了 C++ 支持的所有關(guān)系運(yùn)算符。同樣還是假設(shè)變量 A 的值為 10,變量 B 的值為 20,則:
| 運(yùn)算符 | | |
|---|---|---|
| == | 檢查兩個(gè)操作數(shù)的值是否相等,如果相等則條件為真。 | (A==B)不為真。 |
| != | 檢查兩個(gè)操作數(shù)的值是否相等,如果不相等則條件為真。 | (A!=B)為真。 |
| > | 檢查左操作數(shù)的值是否大于右操作數(shù)的值,如果是則條件為真。 | (A>B)不為真。 |
| < | 檢查左操作數(shù)的值是否小于右操作數(shù)的值,如果是則條件為真。 | (A<B)為真。 |
| >= | 檢查左操作數(shù)的值是否大于或等于右操作數(shù)的值,如果是則條件為真。 | (A>=B)不為真。 |
| <= | 檢查左操作數(shù)的值是否小于或等于右操作數(shù)的值,如果是則條件為真。 | (A<=B)為真。 |
關(guān)系運(yùn)算符實(shí)例:
請(qǐng)看下面的實(shí)例,了解 C++ 中所有可用的關(guān)系運(yùn)算符,復(fù)制并黏貼下面的 C++ 程序到 test.cpp 文件中,編譯并運(yùn)行程序即可。
#include <iostream> using namespace std; main() { int a = 21; int b = 10; int c ; if( a == b ) { cout << "Line 1 - a 等于 b" << endl ; } else { cout << "Line 1 - a 不等于 b" << endl ; } if ( a < b ) { cout << "Line 2 - a 小于 b" << endl ; } else { cout << "Line 2 - a 不小于 b" << endl ; } if ( a > b ) { cout << "Line 3 - a 大于 b" << endl ; } else { cout << "Line 3 - a 不大于 b" << endl ; } /* 改變 a 和 b 的值 */ a = 5; b = 20; if ( a <= b ) { cout << "Line 4 - a 小于或等于 b" << endl ; } if ( b >= a ) { cout << "Line 5 - b 大于或等于 b" << endl ; } return 0; } 當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
Line 1 - a 不等于 b Line 2 - a 不小于 b Line 3 - a 大于 b Line 4 - a 小于或等于 b Line 5 - b 大于或等于 b
下表顯示了 C++ 支持的所有關(guān)系邏輯運(yùn)算符。假設(shè)變量 A 的值為 1,變量 B 的值為 0,則:
| 運(yùn)算符 | | |
|---|---|---|
| && | 稱為邏輯與運(yùn)算符。如果兩個(gè)操作數(shù)都非零,則條件為真。 | (A&&B)為假。 |
| || | 稱為邏輯或運(yùn)算符。如果兩個(gè)操作數(shù)中有任意一個(gè)非零,則條件為真。 | (A||B)為真。 |
| ! | 稱為邏輯非運(yùn)算符。用來逆轉(zhuǎn)操作數(shù)的邏輯狀態(tài)。如果條件為真則邏輯非運(yùn)算符將使其為假。 | !(A&&B)為真。 |
邏輯運(yùn)算符實(shí)例:
請(qǐng)看下面的實(shí)例,了解 C++ 中所有可用的邏輯運(yùn)算符,復(fù)制并黏貼下面的 C++ 程序到 test.cpp 文件中,編譯并運(yùn)行程序即可。
#include <iostream> using namespace std; main() { int a = 5; int b = 20; int c ; if ( a && b ) { cout << "Line 1 - 條件為真"<< endl ; } if ( a || b ) { cout << "Line 2 - 條件為真"<< endl ; } /* 改變 a 和 b 的值 */ a = 0; b = 10; if ( a && b ) { cout << "Line 3 - 條件為真"<< endl ; } else { cout << "Line 4 - 條件不為真"<< endl ; } if ( !(a && b) ) { cout << "Line 5 - 條件為真"<< endl ; } return 0; } 當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
Line 1 - 條件為真 Line 2 - 條件為真 Line 3 - 條件不為真 Line 4 - 條件為真
位運(yùn)算符作用于位,并逐位執(zhí)行操作。&、 | 和 ^ 的真值表如下所示:
| p | q | p&q | p|q | p^q |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 | 1 |
假設(shè)如果 A = 60,且 B = 13,現(xiàn)在以二進(jìn)制格式表示,它們?nèi)缦滤荆?/p> A = 0011 1100 B = 0000 1101 ----------------- A&B = 0000 1100 A|B = 0011 1101 A^B = 0011 0001 ~A = 1100 0011
下表顯示了 C++ 支持的位運(yùn)算符。假設(shè)變量 A 的值為 60,變量 B 的值為 13,則:
| 運(yùn)算符 | | |
|---|---|---|
| & | 如果同時(shí)存在于兩個(gè)操作數(shù)中,二進(jìn)制AND運(yùn)算符復(fù)制一位到結(jié)果中。 | (A&B)將得到12,即為0000 1100 |
| | | 如果存在于任一操作數(shù)中,二進(jìn)制OR運(yùn)算符復(fù)制一位到結(jié)果中。 | (A|B)將得到61,即為0011 1101 |
| ^ | 如果存在于其中一個(gè)操作數(shù)中但不同時(shí)存在于兩個(gè)操作數(shù)中,二進(jìn)制 異或運(yùn)算符復(fù)制一位到結(jié)果中。 | (A^B)將得到49,即為0011 0001 |
| ~ | 二進(jìn)制補(bǔ)碼運(yùn)算符是一元運(yùn)算符,具有"翻轉(zhuǎn)"位效果。 | (~A)將得到-61,即為1100 0011,2的補(bǔ)碼形式,帶符號(hào)的二進(jìn)制數(shù)。 |
| << | 二進(jìn)制左移運(yùn)算符。左操作數(shù)的值向左移動(dòng)右操作數(shù)指定的位數(shù)。 | A<<2將得到240,即為1111 0000 |
| >> | 二進(jìn)制右移運(yùn)算符。左操作數(shù)的值向右移動(dòng)右操作數(shù)指定的位數(shù)。 | A>>2將得到15,即為0000 1111 |
運(yùn)算符實(shí)例:
請(qǐng)看下面的實(shí)例,了解 C++ 中所有可用的邏輯運(yùn)算符,復(fù)制并黏貼下面的 C++ 程序到 test.cpp 文件中,編譯并運(yùn)行程序即可。
#include <iostream> using namespace std; main() { unsigned int a = 60; // 60 = 0011 1100 unsigned int b = 13; // 13 = 0000 1101 int c = 0; c = a & b; // 12 = 0000 1100 cout << "Line 1 - c 的值是 " << c << endl ; c = a | b; // 61 = 0011 1101 cout << "Line 2 - c 的值是 " << c << endl ; c = a ^ b; // 49 = 0011 0001 cout << "Line 3 - c 的值是 " << c << endl ; c = ~a; // -61 = 1100 0011 cout << "Line 4 - c 的值是 " << c << endl ; c = a << 2; // 240 = 1111 0000 cout << "Line 5 - c 的值是 " << c << endl ; c = a >> 2; // 15 = 0000 1111 cout << "Line 6 - c 的值是 " << c << endl ; return 0; } 當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
Line 1 - c 的值是 12 Line 2 - c 的值是 61 Line 3 - c 的值是 49 Line 4 - c 的值是 -61 Line 5 - c 的值是 240 Line 6 - c 的值是 15
下表列出了 C++ 支持的賦值運(yùn)算符:
| 運(yùn)算符 | 描述 | 實(shí)例 |
|---|---|---|
| = | 簡單的賦值運(yùn)算符,把右邊操作數(shù)的值賦給左邊操作數(shù) | C=A+B將把A+B的值賦給C |
| += | 加且賦值運(yùn)算符,把右邊操作數(shù)加上左邊操作數(shù)的結(jié)果賦值給左邊操作數(shù) | C+=A相當(dāng)于C=C+A |
| -= | 減且賦值運(yùn)算符,把左邊操作數(shù)減去右邊操作數(shù)的結(jié)果賦值給左邊操作數(shù) | C-=A相當(dāng)于C=C-A |
| *= | 乘且賦值運(yùn)算符,把右邊操作數(shù)乘以左邊操作數(shù)的結(jié)果賦值給左邊操作數(shù) | C=A相當(dāng)于C=CA |
| /= | 除且賦值運(yùn)算符,把左邊操作數(shù)除以右邊操作數(shù)的結(jié)果賦值給左邊操作數(shù) | C/=A相當(dāng)于C=C/A |
| %= | 求模且賦值運(yùn)算符,求兩個(gè)操作數(shù)的模賦值給左邊操作數(shù) | C%=A相當(dāng)于C=C%A |
| <<= | 左移且賦值運(yùn)算符 | C<<=2等同于C=C<<2 |
| >>= | 右移且賦值運(yùn)算符 | C>>=2等同于C=C>>2 |
| &= | 按位與且賦值運(yùn)算符 | C&=2等同于C=C&2 |
| ^= | 按位異或且賦值運(yùn)算符 | C^=2等同于C=C^2 |
| |= | 按位或且賦值運(yùn)算符 | C|=2等同于C=C|2 |
賦值運(yùn)算符實(shí)例:
請(qǐng)看下面的實(shí)例,了解 C++ 中所有可用的賦值運(yùn)算符,復(fù)制并黏貼下面的 C++ 程序到 test.cpp 文件中,編譯并運(yùn)行程序即可。
#include <iostream> using namespace std; main() { int a = 21; int c ; c = a; cout << "Line 1 - = 運(yùn)算符實(shí)例,c 的值 = : " <<c<< endl ; c += a; cout << "Line 2 - += 運(yùn)算符實(shí)例,c 的值 = : " <<c<< endl ; c -= a; cout << "Line 3 - -= 運(yùn)算符實(shí)例,c 的值 = : " <<c<< endl ; c *= a; cout << "Line 4 - *= 運(yùn)算符實(shí)例,c 的值 = : " <<c<< endl ; c /= a; cout << "Line 5 - /= 運(yùn)算符實(shí)例,c 的值 = : " <<c<< endl ; c = 200; c %= a; cout << "Line 6 - %= 運(yùn)算符實(shí)例,c 的值 = : " <<c<< endl ; c <<= 2; cout << "Line 7 - <<= 運(yùn)算符實(shí)例,c 的值 = : " <<c<< endl ; c >>= 2; cout << "Line 8 - >>= 運(yùn)算符實(shí)例,c 的值 = : " <<c<< endl ; c &= 2; cout << "Line 9 - &= 運(yùn)算符實(shí)例,c 的值 = : " <<c<< endl ; c ^= 2; cout << "Line 10 - ^= 運(yùn)算符實(shí)例,c 的值 = : " <<c<< endl ; c |= 2; cout << "Line 11 - |= 運(yùn)算符實(shí)例,c 的值 = : " <<c<< endl ; return 0; } 當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
Line 1 - = 運(yùn)算符實(shí)例,c 的值 = 21 Line 2 - += 運(yùn)算符實(shí)例,c 的值 = 42 Line 3 - -= 運(yùn)算符實(shí)例,c 的值 = 21 Line 4 - *= 運(yùn)算符實(shí)例,c 的值 = 441 Line 5 - /= 運(yùn)算符實(shí)例,c 的值 = 21 Line 6 - %= 運(yùn)算符實(shí)例,c 的值 = 11 Line 7 - <<= 運(yùn)算符實(shí)例,c 的值 = 44 Line 8 - >>= 運(yùn)算符實(shí)例,c 的值 = 11 Line 9 - &= 運(yùn)算符實(shí)例,c 的值 = 2 Line 10 - ^= 運(yùn)算符實(shí)例,c 的值 = 0 Line 11 - |= 運(yùn)算符實(shí)例,c 的值 = 2
下表列出了 C++ 支持的其他一些重要的雜項(xiàng)運(yùn)算符。
| 運(yùn)算符 | 描述 |
|---|---|
| sizeof | sizeof運(yùn)算符返回變量的大小。例如,sizeof(a)將返回4,其中a是整數(shù)。 |
| Condition?X:Y | 條件運(yùn)算符。如果Condition為真?則值為X:否則值為Y。 |
| , | 逗號(hào)運(yùn)算符會(huì)順序執(zhí)行一系列運(yùn)算。整個(gè)逗號(hào)表達(dá)式的值是以逗號(hào)分隔的列表中的最后一個(gè)表達(dá)式的值。 |
| .(點(diǎn))和->(箭頭) | 成員運(yùn)算符用于引用類、結(jié)構(gòu)和共用體的成員。 |
| Cast | 強(qiáng)制轉(zhuǎn)換運(yùn)算符把一種數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型。例如,int(2.2000)將返回2。 |
| & | 指針運(yùn)算符&返回變量的地址。例如&a;將給出變量的實(shí)際地址。 |
| * | 指針運(yùn)算符*指向一個(gè)變量。例如,*var;將指向變量var。 |
雜項(xiàng)運(yùn)算符實(shí)例:
請(qǐng)看下面的實(shí)例,了解 C++ 中運(yùn)算符的優(yōu)先級(jí),復(fù)制并黏貼下面的 C++ 程序到 test.cpp 文件中,編譯并運(yùn)行程序即可。
對(duì)比有括號(hào)和沒有括號(hào)時(shí)的區(qū)別,這將產(chǎn)生不同的結(jié)果。因?yàn)?()、 /、 * 和 + 有不同的優(yōu)先級(jí),高優(yōu)先級(jí)的操作符將優(yōu)先計(jì)算。
#include <iostream> using namespace std; main() { int a = 20; int b = 10; int c = 15; int d = 5; int e; e = (a + b) * c / d; // ( 30 * 15 ) / 5 cout << "(a + b) * c / d 的值是 " << e << endl ; e = ((a + b) * c) / d; // (30 * 15 ) / 5 cout << "((a + b) * c) / d 的值是 " << e << endl ; e = (a + b) * (c / d); // (30) * (15/5) cout << "(a + b) * (c / d) 的值是 " << e << endl ; e = a + (b * c) / d; // 20 + (150/5) cout << "a + (b * c) / d 的值是 " << e << endl ; return 0; } 當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
(a + b) * c / d 的值是 90 ((a + b) * c) / d 的值是 90 (a + b) * (c / d) 的值是 90 a + (b * c) / d 的值是 50
更新時(shí)間:2023-09-24 08:11:22
綜合技術(shù)交流:點(diǎn)擊加入--> [SO JSON官方交流①群][收費(fèi)]
綜合技術(shù)交流:點(diǎn)擊加入--> [SO JSON官方交流②群][免費(fèi)]
要求:不能發(fā)廣告、暴力、政治、付費(fèi)教程,違者直接踢出。
備注:入群費(fèi)用5元,沒有QQ錢包,可以先支付寶 or 微信掃碼支付5元贊助后,我拉您進(jìn)去。QQ聯(lián)系我。
掃碼贊助:贊助二維碼。
技術(shù)交流QQ群:①群259217951,②群166848545
站長郵箱:so@sojson.com
對(duì)頁面內(nèi)容有任何疑問和建議,請(qǐng)聯(lián)系我們。
所有贊助/開支都講公開明細(xì),用于網(wǎng)站維護(hù):贊助名單查看
正在加載... ...