C、C++、Java、C#運算子優先順序
C語言優先順序
優先順序 |
運算子 |
名稱或含義 |
使用形式 |
結合方向 |
說明 |
1 |
[] |
陣列下標 |
陣列名[整型表示式] |
左到右 |
|
() |
圓括號 |
(表示式)/函式名(形參表) |
|||
. |
成員選擇(物件) |
物件.成員名 |
|||
-> |
成員選擇(指標) |
物件指標->成員名 |
|||
2 |
- |
負號運算子 |
-算術型別表示式 |
右到左 |
單目運算子 |
(type) |
強制型別轉換 |
(純量資料型別)純量表達式 |
|||
++ |
自增運算子 |
++純量型別可修改左值表示式 |
單目運算子 |
||
-- |
自減運算子 |
--純量型別可修改左值表示式 |
單目運算子 |
||
* |
取值運算子 |
*指標型別表示式 |
單目運算子 |
||
& |
取地址運算子 |
&表示式 |
單目運算子 |
||
! |
邏輯非運算子 |
!純量型別表示式 |
單目運算子 |
||
~ |
按位取反運算子 |
~整型表示式 |
單目運算子 |
||
sizeof |
長度運算子 |
sizeof 表示式 sizeof(型別) |
|||
3 | / |
除 |
表示式/表示式 |
左到右 | 雙目運算子 |
* |
乘 |
表示式*表示式 |
雙目運算子 |
||
% |
餘數(取模) |
整型表示式%整型表示式 |
雙目運算子 |
||
4 |
+ |
加 |
表示式+表示式 |
左到右 |
雙目運算子 |
- |
減 |
表示式-表示式 |
雙目運算子 |
||
5 |
<< |
左移 |
整型表示式<<整型表示式 |
左到右 |
雙目運算子 |
>> |
右移 |
整型表示式>>整型表示式 |
雙目運算子 |
||
6 |
> |
大於 |
表示式>表示式 |
左到右 |
雙目運算子 |
>= |
大於等於 |
表示式>=表示式 |
雙目運算子 |
||
< |
小於 |
表示式<表示式 |
雙目運算子 |
||
<= |
小於等於 |
表示式<=表示式 |
雙目運算子 |
||
7 |
== |
等於 |
表示式==表示式 |
左到右 |
雙目運算子 |
!= |
不等於 |
表示式!= 表示式 |
雙目運算子 |
||
8 |
& |
按位與 |
整型表示式&整型表示式 |
左到右 |
雙目運算子 |
9 |
^ |
按位異或 |
整型表示式^整型表示式 |
左到右 |
雙目運算子 |
10 |
| |
按位或 |
整型表示式|整型表示式 |
左到右 |
雙目運算子 |
11 |
&& |
邏輯與 |
表示式&&表示式 |
左到右 |
雙目運算子 |
12 |
|| |
邏輯或 |
表示式||表示式 |
左到右 |
雙目運算子 |
13 |
?: |
條件運算子 |
表示式1? 表示式2: 表示式3 |
右到左 |
三目運算子 |
14 |
= |
賦值運算子 |
可修改左值表示式=表示式 |
右到左 |
|
/= |
除後賦值 |
可修改左值表示式/=表示式 |
|||
*= |
乘後賦值 |
可修改左值表示式*=表示式 |
|||
%= |
取模後賦值 |
可修改左值表示式%=表示式 |
|||
+= |
加後賦值 |
可修改左值表示式+=表示式 |
|||
-= |
減後賦值 |
可修改左值表示式-=表示式 |
|||
<<= |
左移後賦值 |
可修改左值表示式<<=表示式 |
|||
>>= |
右移後賦值 |
可修改左值表示式>>=表示式 |
|||
&= |
按位與後賦值 |
可修改左值表示式&=表示式 |
|||
^= |
按位異或後賦值 |
可修改左值表示式^=表示式 |
|||
|= |
按位或後賦值 |
可修改左值表示式|=表示式 |
|||
15 |
, |
逗號運算子 |
表示式,表示式,… |
左到右 |
從左向右順序結合 |
說明:
同一優先順序的運算子,結合次序由結合方向所決定。
簡單記就是:! > 算術運算子 > 關係運算符 > && > || > 賦值運算子
C++
運算子 |
描述 |
例子 |
可過載性 |
第一級別 |
|||
:: |
作用域解析符 |
Class::age = 2; |
不可過載 |
第二級別 |
|||
() |
函式呼叫 |
isdigit('1') |
可過載 |
() |
成員初始化 |
c_tor(int x, int y) : _x(x), _y(y*10){}; |
可過載 |
[] |
陣列資料獲取 |
array[4] = 2; |
可過載 |
-> |
指標型成員呼叫 |
ptr->age = 34; |
可過載 |
. |
物件型成員呼叫 |
obj.age = 34; |
不可過載 |
++ |
後自增運算子 |
for( int i = 0; i < 10; i++ ) cout << i; |
可過載 |
-- |
後自減運算子 |
for( int i = 10; i > 0; i-- ) cout << i; |
可過載 |
const_cast |
特殊屬性轉換 |
const_cast<type_to>(type_from); |
不可過載 |
dynamic_cast |
特殊屬性轉換 |
dynamic_cast<type_to>(type_from); |
不可過載 |
static_cast |
特殊屬性轉換 |
static_cast<type_to>(type_from); |
不可過載 |
reinterpret_cast |
特殊屬性轉換 |
reinterpret_cast<type_to>(type_from); |
不可過載 |
typeid |
物件型別符 |
cout « typeid(var).name(); cout « typeid(type).name(); |
不可過載 |
第三級別(具有右結合性) |
|||
! |
邏輯取反 |
if( !done ) … |
可過載 |
not |
! 的另一種表達 |
||
~ |
按位取反 |
flags = ~flags; |
可過載 |
compl |
~的另一種表達 |
||
++ |
預自增運算子 |
for( i = 0; i < 10; ++i ) cout << i; |
可過載 |
-- |
預自減運算子 |
for( i = 10; i > 0; --i ) cout << i; |
可過載 |
- |
負號 |
int i = -1; |
可過載 |
+ |
正號 |
int i = +1; |
可過載 |
* |
指標取值 |
int data = *intPtr; |
可過載 |
& |
值取指標 |
int *intPtr = &data; |
可過載 |
new |
動態元素記憶體分配 |
long *pVar = new long; MyClass *ptr = new MyClass(args); |
可過載 |
new [] |
動態陣列記憶體分配 |
long *array = new long[n]; |
可過載 |
delete |
動態析構元素記憶體 |
delete pVar; |
可過載 |
delete [] |
動態析構陣列記憶體 |
delete [] array; |
可過載 |
(type) |
強制型別轉換 |
int i = (int) floatNum; |
可過載 |
sizeof |
返回型別記憶體 |
int size = sizeof floatNum; int size = sizeof(float); |
不可過載 |
第四級別 |
|||
->* |
類指標成員引用 |
ptr->*var = 24; |
可過載 |
.* |
類物件成員引用 |
obj.*var = 24; |
不可過載 |
第五級別 |
|||
* |
乘法 |
int i = 2 * 4; |
可過載 |
/ |
除法 |
float f = 10.0 / 3.0; |
可過載 |
% |
取餘數(模運算) |
int rem = 4 % 3; |
可過載 |
第六級別 |
|||
+ |
加法 |
int i = 2 + 3; |
可過載 |
- |
減法 |
int i = 5 - 1; |
可過載 |
第七級別 |
|||
<< |
位左移 |
int flags = 33 << 1; |
可過載 |
>> |
位右移 |
int flags = 33 >> 1; |
可過載 |
第八級別 |
|||
< |
小於 |
if( i < 42 ) … |
可過載 |
<= |
小於等於 |
if( i <= 42 ) ... |
可過載 |
> |
大於 |
if( i > 42 ) … |
可過載 |
>= |
大於等於 |
if( i >= 42 ) ... |
可過載 |
第九級別 |
|||
== |
恆等於 |
if( i == 42 ) ... |
可過載 |
eq |
== 的另一種表達 |
||
!= |
不等於 |
if( i != 42 ) … |
可過載 |
not_eq |
!=的另一種表達 |
||
第十級別 |
|||
& |
位且運算 |
flags = flags & 42; |
可過載 |
bitand |
&的另一種表達 |
||
第十一級別 |
|||
^ |
位異或運算 |
flags = flags ^ 42; |
可過載 |
xor |
^的另一種表達 |
||
第十二級別 |
|||
| |
位或運算 |
flags = flags | 42; |
可過載 |
bitor |
|的另一種表達 |
||
第十三級別 |
|||
&& |
邏輯且運算 |
if( conditionA && conditionB ) … |
可過載 |
and |
&&的另一種表達 |
||
第十四級別 |
|||
|| |
邏輯或運算 |
if( conditionA || conditionB ) ... |
可過載 |
or |
||的另一種表達 |
||
第十五級別(具有右結合性) |
|||
? : |
條件運算子 |
int i = (a > b) ? a : b; |
不可過載 |
第十六級別(具有右結合性) |
|||
= |
賦值 |
int a = b; |
可過載 |
+= |
加賦值運算 |
a += 3; |
可過載 |
-= |
減賦值運算 |
b -= 4; |
可過載 |
*= |
乘賦值運算 |
a *= 5; |
可過載 |
/= |
除賦值運算 |
a /= 2; |
可過載 |
%= |
模賦值運算 |
a %= 3; |
可過載 |
&= |
位且賦值運算 |
flags &= new_flags; |
可過載 |
and_eq |
&= 的另一種表達 |
||
^= |
位異或賦值運算 |
flags ^= new_flags; |
可過載 |
xor_eq |
^=的另一種表達 |
||
|= |
位或賦值運算 |
flags |= new_flags; |
可過載 |
or_eq |
|=的另一種表達 |
||
<<= |
位左移賦值運算 |
flags <<= 2; |
可過載 |
>>= |
位右移賦值運算 |
flags >>= 2; |
可過載 |
第十七級別 |
|||
throw |
異常丟擲 |
throw EClass(“Message”); |
不可過載 |
第十八級別 |
|||
, |
逗號分隔符 |
for( i = 0, j = 0; i < 10; i++, j++ ) … |
可過載 |
Java
運算子 | 結合性 |
---|---|
[ ] . ( ) (方法呼叫) | 從左向右 |
! ~ ++ -- +(一元運算) -(一元運算) | 從右向左 |
* / % | 從左向右 |
+ - | 從左向右 |
<< >> >>> | 從左向右 |
< <= > >= instanceof | 從左向右 |
== != | 從左向右 |
& | 從左向右 |
^ | 從左向右 |
| | 從左向右 |
&& | 從左向右 |
|| | 從左向右 |
?: | 從右向左 |
= |
從右向左 |
一個特殊的例子:
public class stlye
{
public static void main(String[] args)
{
int a=10,b=6;
System.out.println("改變之前的數:a="+a+",b="+b);
a-=b++;
System.out.println("改變之後的數:a="+a+",b="+b);
}
}
運算結果為:
改變之前的數:a=10,b=6
改變之後的數:a=4,b=7
因為b++運算中先執行++,再返回後置++運算表示式(b++)的返回值(6)給-=運算子。
在這個程式中a-=b++等於a=a-b++=10-6,所以a=4。
C#
優先順序 |
類別 |
運算子 |
1 |
基本 |
(x) x.y f(x) a[x] x++ x-- new typeof sizeof checked unchecked |
2 |
單目 |
+ - ! ~ ++x --x (T)x |
3 |
乘法與除法 |
* / % |
4 |
加法與減法 |
+ - |
5 |
移位運算 |
<< >> |
6 |
關係運算 |
< > <= >= |
7 |
條件等 |
== != |
8 |
位邏輯與 |
& |
9 |
位邏輯異或 |
^ |
10 |
位邏輯或 |
| |
11 |
條件與 |
&& |
12 |
條件或 |
‖ |
13 |
條件 |
?: |
14 |
賦值 |
= |
一個特殊的例子:
class Program
{
static void Main(string[] args)
{
int a; a = 10; int b = 4;
a += b++;
Console.WriteLine("a={0}",a);
Console.WriteLine("b={0}", b);
Console.ReadLine();
}
}
運算結果為:
a=14
b=5
在這個程式中a+=b等於a=a+b=10+4,因為 b++ 時返回了一個臨時變數後才進行自增。