複製鏈接
請複製以下鏈接發送給好友

運算符優先級

鎖定
在一個表達式中可能包含多個有不同運算符連接起來的、具有不同數據類型數據對象;由於表達式有多種運算,不同的結合順序可能得出不同結果甚至出現錯誤運算錯誤,因為當表達式中含多種運算時,必須按一定順序進行結合,才能保證運算的合理性和結果的正確性、唯一性
優先級從上到下依次遞減,最上面具有最高的優先級,逗號操作符具有最低的優先級。表達式的結合次序取決於表達式中各種運算符的優先級。優先級高的運算符先結合,優先級低的運算符後結合,同一行中的運算符的優先級相同。 [1] 
中文名
運算符優先級
外文名
Operator Precedence
結合次序
表達式中各種運算符的優先級
最高優先級
是一類特殊的操作
單目運算符
具有相同的優先級
一元運算符
只須一個操作數就能執行的運算符

運算符優先級簡介

每種同類型的運算符都有內部的運算符優先級,不同類型的運算符之間也有相應的優先級順序。一個表達式中既可以包括相同類型的運算符,也可以包括不同類型的運算符或者函數。當多種運算符出現在同一個表達式中時,應該先按照不同類型運算符間的優先級進行運算。各種運算符間的優先級如下:數值運算符、字符串運算符、關係運算符、邏輯運算符。可以用括號改變優先級順序,使得括號內的運算優先於括號外的運算。對於多重括號,總是由內到外強制表達式的某些部分優先運行。括號內的運算總是最優先計算。 [2] 

運算符優先級優先級與運算符

優先級
優先級與求值順序無關。如a+b && b*c,雖然*優先級最高,但這個表達式求值順序是從左到右。
優先級從上到下依次遞減,最上面具有最高的優先級,逗號操作符具有最低的優先級。
相同優先級中,按結合性進行結合。大多數運算符結合性是從左到右,只有三個優先級是從右至左結合的,它們是單目運算符條件運算符賦值運算符
基本的優先級需要記住:
指針最優,單目運算優於雙目運算。如正負號
算術運算,後移位運算,最後位運算。請特別注意:1
邏輯運算最後結合。
運算符
運算符是一種特殊的函數,它們具有一個或多個操作數並返回相應的值。操作數是被運算符用作輸入的值,通常是字面值、變量或表達式。運算符可以是一元、二元或三元的,一元運算符有1個操作數,二元運算符有2個操作數,三元運算符有3個操作數。
結合性
當一個運算對象兩側的運算符優先級別相同時,則按運算符的結合性來確定表達式的運算順序。關於結合性的概念在其他高級語言中是沒有的,這是C語言的特點之一。在標準C語言的文檔裏,對操作符的結合性並沒有做出非常清楚的解釋。一個滿分的回答是:它是仲裁者,在幾個操作符具有相同的優先級時決定先執行哪一個。C語言也將34種運算符規定了不同的結合性。大多數運算符結合方向是“自左至右”,即:先左後右,也叫“左結合性”,例如 a-b + c,表達式中有-和+兩種運算符,且優先級相同,按先左後右結合方向,先圍繞減號結合,執行a-b的運算,再圍繞加號結合,完成運算(a-b) + c。除了左結合性外,C 語言有三類運算符的結合方向是從右至左,也叫“右結合性”,即:單目運算符、條件運算符、以及賦值運算符。着重強調一點,無論是左結合性,還是右結合性,是針對兩個相鄰的優先級相同的運行符而言(不是表達中的運算對象),運算符是決定左右的基準點,先以前面的運算符(即位置上處於左邊的運算符)構造運算,就是左結合,反之,就是右結合 [3] 

運算符優先級C語言優先級

優先級
運算符
名稱或含義
使用形式
結合方向
説明
1
[]
數組下標
數組名[常量表達式]
左到右
-----
()
圓括號
(表達式)/函數名(形參表)
-----
.
成員選擇(對象)
對象.成員名
-----
->
成員選擇(指針)
對象指針->成員名
-----
2
-
負號運算符
-表達式
右到左
單目運算符
(類型)
強制類型轉換
(數據類型)表達式
-----
++
前置自增運算符
++變量名
單目運算符
++
後置自增運算符
變量名++
單目運算符
--
前置自減運算符
--變量名
單目運算符
--
後置自減運算符
變量名--
單目運算符 [4] 
*
取值運算符
*指針變量
單目運算符
&
取地址運算符
&變量名
單目運算符
!
邏輯非運算符
!表達式
單目運算符
~
按位取反運算符
~表達式
單目運算符
sizeof
長度運算符
sizeof(表達式)
-----
3
/
表達式/表達式
左到右
雙目運算符
*
表達式*表達式
雙目運算符
%
餘數(取模)
整型表達式/整型表達式
雙目運算符
4
+
表達式+表達式
左到右
雙目運算符
-
表達式-表達式
雙目運算符
5
<<
左移
變量
左到右
雙目運算符
>>
右移
變量>>表達式
雙目運算符
6
>
大於
表達式>表達式
左到右
雙目運算符
>=
大於等於
表達式>=表達式
雙目運算符
<
小於
表達式
雙目運算符
<=
小於等於
表達式
雙目運算符
7
==
等於
表達式==表達式
左到右
雙目運算符
!=
不等於
表達式!= 表達式
雙目運算符
8
&
按位與
表達式&表達式
左到右
雙目運算符
9
^
按位異或
表達式^表達式
左到右
雙目運算符
10
|
按位或
表達式|表達式
左到右
雙目運算符
11
&&
邏輯與
表達式&&表達式
左到右
雙目運算符
12
||
邏輯或
表達式||表達式
左到右
雙目運算符
13
?:
條件運算符
表達式1? 表達式2: 表達式3
右到左
三目運算符
14
=
賦值運算符
變量=表達式
右到左
-----
/=
除後賦值
變量/=表達式
-----
*=
乘後賦值
變量*=表達式
-----
%=
取模後賦值
變量%=表達式
-----
+=
加後賦值
變量+=表達式
-----
-=
減後賦值
變量-=表達式
-----
<<=
左移後賦值
變量
-----
>>=
右移後賦值
變量>>=表達式
-----
&=
按位與後賦值
變量&=表達式
-----
^=
按位異或後賦值
變量^=表達式
-----
|=
按位或後賦值
變量|=表達式
-----
15
,
逗號運算符
表達式,表達式,…
左到右
從左向右順序運算
説明:
同一優先級的運算符,運算次序由結合方向所決定。
簡單記就是:! > 算術運算符 > 關係運算符 > && > || > 賦值運算符 [5] 

運算符優先級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
可重載
--
後自減運算符
for( int i = 10; i > 0; i-- ) cout
可重載
const_cast
特殊屬性轉換
const_cast(type_from);
不可重載
dynamic_cast
特殊屬性轉換
dynamic_cast(type_from);
不可重載
static_cast
特殊屬性轉換
static_cast(type_from);
不可重載
reinterpret_cast
特殊屬性轉換
reinterpret_cast(type_from);
不可重載
typeid
對象類型符
cout « typeid(var).name();
cout « typeid(type).name();
不可重載
第三級別(具有右結合性)
-----
-----
-----
!
邏輯取反
if( !done ) …
可重載
not
! 的另一種表達
-----
-----
~
按位取反
flags = ~flags;
可重載
compl
~的另一種表達
-----
-----
++
預自增運算符
for( i = 0; i < 10; ++i ) cout
可重載
--
預自減運算符
for( i = 10; i > 0; --i ) cout
可重載
-
負號
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
可重載
>>
位右移
int flags = 33 >> 1;
可重載
第八級別
-----
-----
-----
<
小於
if( i < 42 ) …
可重載
<=
小於等於
if( i
可重載
>
大於
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++ 時返回了一個臨時變量後才進行自增。

運算符優先級Visual Basic

優先級
類別
運算符
1
乘方
^
2
取負
-
3
*
3
/
4
四捨五入除/位移
\
5
取模
Mod
6
+
6
-
7
字符串合併
& 或 +
8
相等
=
8
大於
>
8
大於等於
>=
8
小於
<
8
小於等於
<=
8
不等於
<>
8
同類對象
Is
8
Like運算
Like
9
Not
10
And
11
Or
12
異或
Xor
13
邏輯等
Eqv
14
邏輯大於等於(藴含)
Imp
參考資料