1. 程式人生 > >C、C++、Java、C#運算子優先順序

C、C++、Java、C#運算子優先順序

轉自:https://baike.baidu.com/item/%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7/4752611?fr=aladdin

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 &laquo; typeid(var).name();

cout &laquo; 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++ 時返回了一個臨時變數後才進行自增。