C++運算符優先級,是描述在計算機運算計算表達式時執行運算的先后順序。 先執行具有較高優先級的運算,然后執行較低優先級的運算。 例如,我們常說的先執行相乘和除,再執行加減運算。
優先級 | 運算符 | 說明 | 結合性 |
---|---|---|---|
1 | :: | 范圍解析 | 自左向右 |
2 | ++ -- | 后綴自增/后綴自減 | |
() | 括號 | ||
[] | 數組下標 | ||
. | 成員選擇(對象) | ||
?> | 成員選擇(指針) | ||
3 | ++ -- | 前綴自增/前綴自減 | 自右向左 |
+ ? | 加/減 | ||
! ~ | 邏輯非/按位取反 | ||
(type) | 強制類型轉換 | ||
* | 取指針指向的值 | ||
& | 某某的地址 | ||
sizeof | 某某的大小 | ||
new,new[] | 動態內存分配/動態數組內存分配 | ||
delete,delete[] | 動態內存釋放/動態數組內存釋放 | ||
4 | .* ->* | 成員對象選擇/成員指針選擇 | 自左向右 |
5 | * / % | 乘法/除法/取余 | |
6 | + ? | 加號/減號 | |
7 | << >> | 位左移/位右移 | |
8 | < <= | 小于/小于等于 | |
> >= | 大于/大于等于 | ||
9 | == != | 等于/不等于 | |
10 | & | 按位與 | |
11 | ^ | 按位異或 | |
12 | | | 按位或 | |
13 | && | 與運算 | |
14 | || | 或運算 | |
15 | ?: | 三目運算符 | 自右向左 |
16 | = | 賦值 | |
+= ?= | 相加后賦值/相減后賦值 | ||
*= /= %= | 相乘后賦值/相除后賦值/取余后賦值 | ||
<<= >>= | 位左移賦值/位右移賦值 | ||
&= ^= |= | 位與運算后賦值/位異或運算后賦值/位或運算后賦值 | ||
17 | throw | 拋出異常 | |
18 | , | 逗號 | 自左向右 |
優先級 | 操作符 | 描述 | 例子 | 結合性 |
---|---|---|---|---|
1 | () [] -> . :: ++ -- | 調節優先級的括號操作符 數組下標訪問操作符 通過指向對象的指針訪問成員的操作符 通過對象本身訪問成員的操作符 作用域操作符 后置自增操作符 后置自減操作符 | (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 | 邏輯取反操作符 按位取反(按位取補) 前置自增操作符 前置自減操作符 一元取負操作符 一元取正操作符 解引用操作符 取地址操作符 類型轉換操作符 返回對象占用的字節數操作符 | 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 | ->* .* | 在指針上通過指向成員的指針訪問成員的操作符 在對象上通過指向成員的指針訪問成員的操作符 | ptr->*var=24; obj.*var=24; | 從左到右 |
4 | * / % | 乘法操作符 除法操作符 取余數操作符 | 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 | = += -= *= /= %= &= ^= |= <<= >>= | 賦值操作符 復合賦值操作符(加法) 復合賦值操作符(減法) 復合賦值操作符(乘法) 復合賦值操作符(除法) 復合賦值操作符(取余) 復合賦值操作符(按位與) 復合賦值操作符(按位異或) 復合賦值操作符(按位或) 復合賦值操作符(按位左移) 復合賦值操作符(按位右移) | 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 | , | 逗號操作符 | for(i=0,j=0;i<10;i++,j++)... | 從左到右 |
運算符是一種告訴編譯器執行特定的數學或邏輯操作的符號。C++ 內置了豐富的運算符,并提供了以下類型的運算符:
下表顯示了 C++ 支持的所有算術運算符。假設變量 A 的值為 10,變量 B 的值為 20,則:
運算符 | 描述 | 實例 |
---|---|---|
+ | 把兩個操作數相加 | A+B將得到30 |
- | 從第一個操作數中減去第二個操作數 | A-B將得到-10 |
* | 把兩個操作數相乘 | A*B將得到200 |
/ | 分子除以分母 | B/A將得到2 |
% | 取模運算符,整除后的余數 | B%A將得到0 |
++ | 自增運算符,整數值增加1 | A++將得到11 |
-- | 自減運算符,整數值減少1 | A--將得到9 |
算術運算符實例:
請看下面的實例,了解 C++ 中所有可用的算術運算符,復制并黏貼下面的 C++ 程序到 test.cpp 文件中,編譯并運行程序即可。
#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; }
當上面的代碼被編譯和執行時,它會產生下列結果:
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++ 支持的所有關系運算符。同樣還是假設變量 A 的值為 10,變量 B 的值為 20,則:
運算符 | ||
---|---|---|
== | 檢查兩個操作數的值是否相等,如果相等則條件為真。 | (A==B)不為真。 |
!= | 檢查兩個操作數的值是否相等,如果不相等則條件為真。 | (A!=B)為真。 |
> | 檢查左操作數的值是否大于右操作數的值,如果是則條件為真。 | (A>B)不為真。 |
< | 檢查左操作數的值是否小于右操作數的值,如果是則條件為真。 | (A<B)為真。 |
>= | 檢查左操作數的值是否大于或等于右操作數的值,如果是則條件為真。 | (A>=B)不為真。 |
<= | 檢查左操作數的值是否小于或等于右操作數的值,如果是則條件為真。 | (A<=B)為真。 |
關系運算符實例:
請看下面的實例,了解 C++ 中所有可用的關系運算符,復制并黏貼下面的 C++ 程序到 test.cpp 文件中,編譯并運行程序即可。
#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; }
當上面的代碼被編譯和執行時,它會產生下列結果:
Line 1 - a 不等于 b Line 2 - a 不小于 b Line 3 - a 大于 b Line 4 - a 小于或等于 b Line 5 - b 大于或等于 b
下表顯示了 C++ 支持的所有關系邏輯運算符。假設變量 A 的值為 1,變量 B 的值為 0,則:
運算符 | ||
---|---|---|
&& | 稱為邏輯與運算符。如果兩個操作數都非零,則條件為真。 | (A&&B)為假。 |
|| | 稱為邏輯或運算符。如果兩個操作數中有任意一個非零,則條件為真。 | (A||B)為真。 |
! | 稱為邏輯非運算符。用來逆轉操作數的邏輯狀態。如果條件為真則邏輯非運算符將使其為假。 | !(A&&B)為真。 |
邏輯運算符實例:
請看下面的實例,了解 C++ 中所有可用的邏輯運算符,復制并黏貼下面的 C++ 程序到 test.cpp 文件中,編譯并運行程序即可。
#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; }
當上面的代碼被編譯和執行時,它會產生下列結果:
Line 1 - 條件為真 Line 2 - 條件為真 Line 3 - 條件不為真 Line 4 - 條件為真
位運算符作用于位,并逐位執行操作。&、 | 和 ^ 的真值表如下所示:
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 |
假設如果 A = 60,且 B = 13,現在以二進制格式表示,它們如下所示:
A = 0011 1100 B = 0000 1101 ----------------- A&B = 0000 1100 A|B = 0011 1101 A^B = 0011 0001 ~A = 1100 0011
下表顯示了 C++ 支持的位運算符。假設變量 A 的值為 60,變量 B 的值為 13,則:
運算符 | ||
---|---|---|
& | 如果同時存在于兩個操作數中,二進制AND運算符復制一位到結果中。 | (A&B)將得到12,即為0000 1100 |
| | 如果存在于任一操作數中,二進制OR運算符復制一位到結果中。 | (A|B)將得到61,即為0011 1101 |
^ | 如果存在于其中一個操作數中但不同時存在于兩個操作數中,二進制 異或運算符復制一位到結果中。 | (A^B)將得到49,即為0011 0001 |
~ | 二進制補碼運算符是一元運算符,具有"翻轉"位效果。 | (~A)將得到-61,即為1100 0011,2的補碼形式,帶符號的二進制數。 |
<< | 二進制左移運算符。左操作數的值向左移動右操作數指定的位數。 | A<<2將得到240,即為1111 0000 |
>> | 二進制右移運算符。左操作數的值向右移動右操作數指定的位數。 | A>>2將得到15,即為0000 1111 |
運算符實例:
請看下面的實例,了解 C++ 中所有可用的邏輯運算符,復制并黏貼下面的 C++ 程序到 test.cpp 文件中,編譯并運行程序即可。
#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; }
當上面的代碼被編譯和執行時,它會產生下列結果:
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++ 支持的賦值運算符:
運算符 | 描述 | 實例 |
---|---|---|
= | 簡單的賦值運算符,把右邊操作數的值賦給左邊操作數 | C=A+B將把A+B的值賦給C |
+= | 加且賦值運算符,把右邊操作數加上左邊操作數的結果賦值給左邊操作數 | C+=A相當于C=C+A |
-= | 減且賦值運算符,把左邊操作數減去右邊操作數的結果賦值給左邊操作數 | C-=A相當于C=C-A |
*= | 乘且賦值運算符,把右邊操作數乘以左邊操作數的結果賦值給左邊操作數 | C=A相當于C=CA |
/= | 除且賦值運算符,把左邊操作數除以右邊操作數的結果賦值給左邊操作數 | C/=A相當于C=C/A |
%= | 求模且賦值運算符,求兩個操作數的模賦值給左邊操作數 | C%=A相當于C=C%A |
<<= | 左移且賦值運算符 | C<<=2等同于C=C<<2 |
>>= | 右移且賦值運算符 | C>>=2等同于C=C>>2 |
&= | 按位與且賦值運算符 | C&=2等同于C=C&2 |
^= | 按位異或且賦值運算符 | C^=2等同于C=C^2 |
|= | 按位或且賦值運算符 | C|=2等同于C=C|2 |
賦值運算符實例:
請看下面的實例,了解 C++ 中所有可用的賦值運算符,復制并黏貼下面的 C++ 程序到 test.cpp 文件中,編譯并運行程序即可。
#include <iostream> using namespace std; main() { int a = 21; int c ; c = a; cout << "Line 1 - = 運算符實例,c 的值 = : " <<c<< endl ; c += a; cout << "Line 2 - += 運算符實例,c 的值 = : " <<c<< endl ; c -= a; cout << "Line 3 - -= 運算符實例,c 的值 = : " <<c<< endl ; c *= a; cout << "Line 4 - *= 運算符實例,c 的值 = : " <<c<< endl ; c /= a; cout << "Line 5 - /= 運算符實例,c 的值 = : " <<c<< endl ; c = 200; c %= a; cout << "Line 6 - %= 運算符實例,c 的值 = : " <<c<< endl ; c <<= 2; cout << "Line 7 - <<= 運算符實例,c 的值 = : " <<c<< endl ; c >>= 2; cout << "Line 8 - >>= 運算符實例,c 的值 = : " <<c<< endl ; c &= 2; cout << "Line 9 - &= 運算符實例,c 的值 = : " <<c<< endl ; c ^= 2; cout << "Line 10 - ^= 運算符實例,c 的值 = : " <<c<< endl ; c |= 2; cout << "Line 11 - |= 運算符實例,c 的值 = : " <<c<< endl ; return 0; }
當上面的代碼被編譯和執行時,它會產生下列結果:
Line 1 - = 運算符實例,c 的值 = 21 Line 2 - += 運算符實例,c 的值 = 42 Line 3 - -= 運算符實例,c 的值 = 21 Line 4 - *= 運算符實例,c 的值 = 441 Line 5 - /= 運算符實例,c 的值 = 21 Line 6 - %= 運算符實例,c 的值 = 11 Line 7 - <<= 運算符實例,c 的值 = 44 Line 8 - >>= 運算符實例,c 的值 = 11 Line 9 - &= 運算符實例,c 的值 = 2 Line 10 - ^= 運算符實例,c 的值 = 0 Line 11 - |= 運算符實例,c 的值 = 2
下表列出了 C++ 支持的其他一些重要的雜項運算符。
運算符 | 描述 |
---|---|
sizeof | sizeof運算符返回變量的大小。例如,sizeof(a)將返回4,其中a是整數。 |
Condition?X:Y | 條件運算符。如果Condition為真?則值為X:否則值為Y。 |
, | 逗號運算符會順序執行一系列運算。整個逗號表達式的值是以逗號分隔的列表中的最后一個表達式的值。 |
.(點)和->(箭頭) | 成員運算符用于引用類、結構和共用體的成員。 |
Cast | 強制轉換運算符把一種數據類型轉換為另一種數據類型。例如,int(2.2000)將返回2。 |
& | 指針運算符&返回變量的地址。例如&a;將給出變量的實際地址。 |
* | 指針運算符*指向一個變量。例如,*var;將指向變量var。 |
雜項運算符實例:
請看下面的實例,了解 C++ 中運算符的優先級,復制并黏貼下面的 C++ 程序到 test.cpp 文件中,編譯并運行程序即可。
對比有括號和沒有括號時的區別,這將產生不同的結果。因為 ()、 /、 * 和 + 有不同的優先級,高優先級的操作符將優先計算。
#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; }
當上面的代碼被編譯和執行時,它會產生下列結果:
(a + b) * c / d 的值是 90 ((a + b) * c) / d 的值是 90 (a + b) * (c / d) 的值是 90 a + (b * c) / d 的值是 50