運算子優先順序

Posted by: 邱小新 at 下午2:42 in

最近在寫一段程式碼,剛好有去注意它編譯出來的assembly code,發現怎麼沒有預期出來的結果。結果發現卻是運算子優先順序的問題。切記位元運算的優先權為 shift > and > xor > or,之前一直以為三者是一樣大,原來卻不是如此。希望以前寫的產品不要因為如此而出問題啊,阿彌陀佛,善哉善哉。

原始錯誤程式碼 tmp = *(volatile unsigned char __xdata *)(0x8001) | 0x10 & ~0x08; mov dptr,#0x8001 movx a,@dptr mov r2,a orl ar2,#0x10 修改正確程式碼 tmp = (*(volatile unsigned char __xdata *)(0x8001) | 0x10) & ~0x08; mov dptr,#0x8001 movx a,@dptr mov r2,a mov a,#0x10 orl a,r2 anl a,#0xF7

運算子優先順序

優先
順序
評估順序運算子說明

15

由左至右

., [], ()

欄位存取、陣列索引、函式呼叫和運算式群組

14

由右至左

++, --, -, ~, !, delete, new, typeof, void

一元運算子、傳回資料型別、物件建立、未定義的值

13

由左至右

*, /, %

乘法、除法、modulo 除法

12

由左至右

+, -

加法和字串串連、減法

11

由左至右

<<, >>, >>>

位元移位

10

由左至右

<, <=, >, >=, instanceof

小於、小於或等於、大於、大於或等於、instanceof

9

由左至右

==, !=, ===, !==

等號比較、不等比較、嚴格等號比較和嚴格不等比較

8

由左至右

&

位元 AND

7

由左至右

^

位元 XOR

6

由左至右

|

位元 OR

5

由左至右

&&

邏輯 AND

4

由左至右

||

邏輯 OR

3

由右至左

?:

條件式

2

由右至左

=, OP=

指派、複合指派

1

由左至右

, (逗號)

多重評估

0 意見

張貼留言