再依據運算子之優先順序做運算

Download Report

Transcript 再依據運算子之優先順序做運算

運算子優先序
運算式
• 運算式裡分別有運算子及運算元。
• 在做運算時,首先要區別出運算子及運算
元,再依據運算子之優先順序做運算。
• 計算時可用括號隔開每個需要計算之計算
子,以分辨計算之優先順序。
• 下面將以簡表列出常見之運算之優先順序。
• 最後一頁會附上所有C語言遇到之運算子的
優先順序。
優先序簡表
優先順序 運算子
1
"( ) [ ] { }"," . ->"
"++ --"
2
3
4
5
6
7
8
9
10
11
敘述
結合性
"括號類","物件存取、指標存取"
左結合(由左至右)
"遞增、遞減"
"正負號","一補數","not","指標之參照、參考
"+ -","~","!","* &"
(derefereance、address-of)"
"* / %"
"乘法、除法、餘數"
"+ -"
"加法、減法"
">> <<"
"位元右移、左移"
"> <",">= <="
"大於、小於","大於等於、小於等於"
"== !="
"比較相等、不相等"
"& | ^"
"位元運算之and、or、xor"
"&& ||"
"邏輯判斷之and、or"
"?:"
"三元條件運算式"
"="
"賦值"
左結合(由左至右)、右結合(由右至左)
右結合(由右至左)
左結合(由左至右)
右結合(由右至左)
• 同優先順序之細分請參見最後一頁的附錄。
運算子分類
• 算術運算子:+、-、* 、 / 、% 、++ 、-• 關係運算子:> 、< 、== 、>= 、
<= 、!=
• 邏輯運算子:&& 、|| 、!
• 位元運算子:&、| 、~ 、^ 、<< 、>>
• 除左移與右移以外,一般的優先順序為:
算術>關係>位元>邏輯
範例1
• 輸出結果:S=75
• 運算元優先順序:
*
+
|
• 運算式分解:
S=((a+(b*c))|d)
範例2
• 輸出結果:
S=1
• 運算式分解:
S=a && (b-c) || d
範例3
• 輸出結果:
S=24
• 運算式分解:
S=-a*b+c&d%e|*f-g<<2
S=(((((-a)*b)+c)&(d%e))|(((*f)-g)<<2))
範例3(Cont.)
• 此為上例之運算優先順序
二元樹。
複合指定運算子
• +=、-=、*=、/=、%=、<<=、>>=、
&=、^=、|=
• 複合指定運算子為右結合
• 複合指定運算子之運算式例子:
• a+=b
a=a+b;
• 下面為複合指定運算子及一般運算子之混
合範例
範例1
• 輸出結果:
S=-5
• 運算式分解:
S=(S+(a-(b*c)))
範例2
• 輸出結果:
S=15
• 由於複合指定運算子
為右結合,所以運算
式計算順序為:
1. c=c%5
2. b=b*c
3. a=a|b
4. S=S+a
範例練習
• a=5,b=12,c=6,d=8,e=7,f=9,S=0
1. S=a+b/c&d<<2|e%f,S=?
Ans:7
2. S*=a-b<<c|d*e+f,S=?
Ans:-894
3. S^=a+b|c%d*e,S=?
Ans:57
附錄
優 先 順 序 運算子
敘述
範例
++
字尾遞增
i++
--
字尾遞減
組合
函式呼叫或變數初始化
陣列存取
以物件方式存取成員
i-{i++;a*=i;}
c_tor(int x, int y) : _x(x), _y(y * 10) {}
array[4] = 2;
obj.age = 34;
->
以指標方式存取成員
ptr->age = 34;
++
++i
--i
int i = +1;
int i = -1;
&
字首遞增
字首遞減
一元正號
一元負號
邏輯非
!的備用拼寫
按位取反
~的備用拼寫
強制型別轉換
參照
取某某的位址(參考)
sizeof
某某的大小
size_t s = sizeof(int);
{}
()
[]
1.
-+
!
not
~
2
compl
(type )
*
結合性
由左至右
if (!done) …
flag1 = ~flag2;
int i = (int)floatNum;
int data = *intPtr;
int *intPtr = &data;
由右至左
附錄
優 先 順 序 運算子
敘述
範例
*
乘法
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) ...
xor
除法
模數(取余)
加法
減法
位元左移
位元右移
小於關聯
小於等於關聯
大於關聯
大於等於關聯
等於關聯
==的備用拼寫
不等於關聯
!=的備用拼寫
位元 AND
&的備用拼寫
位元 XOR(獨佔or)
^的備用拼寫
|
位元 OR(包含or)
bitor
|的備用拼寫
&&
邏輯 AND
and
&&的備用拼寫
||
邏輯 OR
||的備用拼寫
結合性
3
%
4
5
+
<<
>>
<
6
<=
>
>=
==
7
eq
!=
not_eq
8
9
10
11
12
&
bitand
^
or
if (i == 42) ...
由左至右
if (i != 42) …
flag1 = flag2 & 42;
flag1 = flag2 ^ 42;
flag1 = flag2 | 42;
if (conditionA && conditionB) …
if (conditionA || conditionB) ...
附錄
優 先 順 序 運算子
13 c ?t :f
=
+=
-=
*=
/=
%=
14
<<=
>>=
&=
and_eq
^=
xor_eq
|=
or_eq
15 ,
敘述
範例
三元條件運算
直接賦值
以和賦值
以差賦值
以乘賦值
以除賦值
以取餘數賦值
以位元左移賦值
以位元右移賦值
以位元AND賦值
&=的備用拼寫
以位元XOR賦值
^=的備用拼寫
以位元OR賦值
|=的備用拼寫
int i = a > b ? a : b;
int a = b;
a += 3;
b -= 4;
a *= 5;
a /= 2;
a %= 3;
flags <<= 2;
flags >>= 2;
迴圈評估運算
for (i = 0, j = 0; i < 10; i++, j++) …
結合性
由右至左
flags &= new_flags;
flags ^= new_flags;
flags |= new_flags;
由左至右