C语言优先级——取反和移位
遇到一個(gè)面試題:
unsigned char a=0xA5;
unsigned char b=~a>>4;
結(jié)果是245,提示的是先提升類型然后移位,然后取反,然后截?cái)唷?/p>
但是單目運(yùn)算符的優(yōu)先級(jí)高于移位運(yùn)算符啊,難道因?yàn)閪是自右向左結(jié)合的?
?
在VS2008中測(cè)試
unsigned char a=0xA5;
unsigned char b=~(a>>4);
結(jié)果b還是254?難道給做了處理?頭疼!
?
C++中算術(shù)運(yùn)算只能針對(duì)int類型,因此會(huì)有提升,提升了以后取反,高位的都是1了,移位以后高四位都是1,因此最后的結(jié)果是245,但是過程不是提示的那樣子。
1:整值提升
0xA5?==?10100101?->?00000000?00000000?00000000?10100101
2:取反
00000000?00000000?00000000?10100101?->?11111111?11111111?11111111?01011010
3:右移
11111111?11111111?11111111?01011010?>>?4?==?11111111?11111111?11111111?11110101(算術(shù)移位)?或者?00001111?11111111?11111111?11110101(邏輯移位)
4:截?cái)?br /> b?==?0xf5即245
?
運(yùn)算符優(yōu)先級(jí):
醋-初等,4個(gè): ( ) [ ] -> 指向結(jié)構(gòu)體成員 . 結(jié)構(gòu)體成員?
壇-單目,10個(gè): !(邏輯取反) ~(位取反,位操作符)?++ -- -負(fù)號(hào) +正號(hào) (類型)???*指針 &取地址 sizeof長(zhǎng)度 (結(jié)合方向:自右向左)
酸-算術(shù),5個(gè): * / % + -?
味-位移,2個(gè): << >>? ?(位操作符)
灌-關(guān)系,6個(gè): < <= > >= == 等于 != 不等于?
味-位邏,3個(gè): & 按位與 ^ 按位異或 | 按位或? (位操作符)
落-邏輯,2個(gè): && 邏輯與 || 邏輯或?
跳-條件,1個(gè),三目: ? :?????????????????????????????????????????????????????????(結(jié)合方向:自右向左)
福-賦值,11個(gè): = += -= *= /= %= >>= <<= &= ^= |=?????????(結(jié)合方向:自右向左)
豆-逗號(hào),1個(gè): ,?
結(jié)合方向自右向左的只有三類:賦值、單目和三目,其它的都是從左至右結(jié)合
?
C語(yǔ)言優(yōu)先級(jí)
| 優(yōu)先級(jí) | 運(yùn)算符 | 名稱或含義 | 使用形式 | 結(jié)合方向 | 說明 | 符號(hào)性質(zhì) |
| 1 | [] | 數(shù)組下標(biāo) | 數(shù)組名[整型表達(dá)式] | 左到右 | ? | 初等(4個(gè)) |
| () | 圓括號(hào) | (表達(dá)式)/函數(shù)名(形參表) | ? | |||
| . | 成員選擇(對(duì)象) | 對(duì)象.成員名 | ? | |||
| -> | 成員選擇(指針) | 對(duì)象指針->成員名 | ? | |||
| 2 | - | 負(fù)號(hào)運(yùn)算符 | -算術(shù)類型表達(dá)式 | 右到左 | 單目運(yùn)算符 | 單目(10個(gè)) |
| + | 正號(hào)運(yùn)算符 | +算術(shù)類型表達(dá)式 | 單目運(yùn)算符 | |||
| (type) | 強(qiáng)制類型轉(zhuǎn)換 | (純量數(shù)據(jù)類型)純量表達(dá)式 | ? | |||
| ++ | 自增運(yùn)算符 | ++純量類型可修改左值表達(dá)式 | 單目運(yùn)算符 | |||
| -- | 自減運(yùn)算符 | --純量類型可修改左值表達(dá)式 | 單目運(yùn)算符 | |||
| * | 取值運(yùn)算符 | *指針類型表達(dá)式 | 單目運(yùn)算符 | |||
| & | 取地址運(yùn)算符 | &表達(dá)式 | 單目運(yùn)算符 | |||
| ! | 邏輯非運(yùn)算符 | !純量類型表達(dá)式 | 單目運(yùn)算符 | |||
| ~ | 按位取反運(yùn)算符 | ~整型表達(dá)式 | 單目運(yùn)算符 | |||
| sizeof | 長(zhǎng)度運(yùn)算符 | sizeof 表達(dá)式 sizeof(類型) | ? | |||
| 3 | / | 除 | 表達(dá)式/表達(dá)式 | 左到右 | 雙目運(yùn)算符 | 算術(shù)(5個(gè)) |
| * | 乘 | 表達(dá)式*表達(dá)式 | 雙目運(yùn)算符 | |||
| % | 余數(shù)(取模) | 整型表達(dá)式%整型表達(dá)式 | 雙目運(yùn)算符 | |||
| 4 | + | 加 | 表達(dá)式+表達(dá)式 | 左到右 | 雙目運(yùn)算符 | |
| - | 減 | 表達(dá)式-表達(dá)式 | 雙目運(yùn)算符 | |||
| 5 | << | 左移 | 整型表達(dá)式<<整型表達(dá)式 | 左到右 | 雙目運(yùn)算符 | 位移(2個(gè)) |
| >> | 右移 | 整型表達(dá)式>>整型表達(dá)式 | 雙目運(yùn)算符 | |||
| 6 | > | 大于 | 表達(dá)式>表達(dá)式 | 左到右 | 雙目運(yùn)算符 | 關(guān)系(6個(gè)) |
| >= | 大于等于 | 表達(dá)式>=表達(dá)式 | 雙目運(yùn)算符 | |||
| < | 小于 | 表達(dá)式<表達(dá)式 | 雙目運(yùn)算符 | |||
| <= | 小于等于 | 表達(dá)式<=表達(dá)式 | 雙目運(yùn)算符 | |||
| 7 | == | 等于 | 表達(dá)式==表達(dá)式 | 左到右 | 雙目運(yùn)算符 | |
| != | 不等于 | 表達(dá)式!= 表達(dá)式 | 雙目運(yùn)算符 | |||
| 8 | & | 按位與 | 整型表達(dá)式&整型表達(dá)式 | 左到右 | 雙目運(yùn)算符 | 位邏(3個(gè)) |
| 9 | ^ | 按位異或 | 整型表達(dá)式^整型表達(dá)式 | 左到右 | 雙目運(yùn)算符 | |
| 10 | | | 按位或 | 整型表達(dá)式|整型表達(dá)式 | 左到右 | 雙目運(yùn)算符 | |
| 11 | && | 邏輯與 | 表達(dá)式&&表達(dá)式 | 左到右 | 雙目運(yùn)算符 | 邏輯(2個(gè)) |
| 12 | || | 邏輯或 | 表達(dá)式||表達(dá)式 | 左到右 | 雙目運(yùn)算符 | |
| 13 | ?: | 條件運(yùn)算符 | 表達(dá)式1? 表達(dá)式2: 表達(dá)式3 | 右到左 | 三目運(yùn)算符 | 條件(1個(gè)) |
| 14 | = | 賦值運(yùn)算符 | 可修改左值表達(dá)式=表達(dá)式 | 右到左 | ? | 賦值(11個(gè)) |
| /= | 除后賦值 | 可修改左值表達(dá)式/=表達(dá)式 | ? | |||
| *= | 乘后賦值 | 可修改左值表達(dá)式*=表達(dá)式 | ? | |||
| %= | 取模后賦值 | 可修改左值表達(dá)式%=表達(dá)式 | ? | |||
| += | 加后賦值 | 可修改左值表達(dá)式+=表達(dá)式 | ? | |||
| -= | 減后賦值 | 可修改左值表達(dá)式-=表達(dá)式 | ? | |||
| <<= | 左移后賦值 | 可修改左值表達(dá)式<<=表達(dá)式 | ? | |||
| >>= | 右移后賦值 | 可修改左值表達(dá)式>>=表達(dá)式 | ? | |||
| &= | 按位與后賦值 | 可修改左值表達(dá)式&=表達(dá)式 | ? | |||
| ^= | 按位異或后賦值 | 可修改左值表達(dá)式^=表達(dá)式 | ? | |||
| |= | 按位或后賦值 | 可修改左值表達(dá)式|=表達(dá)式 | ? | |||
| 15 | , | 逗號(hào)運(yùn)算符 | 表達(dá)式,表達(dá)式,… | 左到右 | 從左向右順序結(jié)合 | 逗號(hào)(1個(gè)) |
說明:
同一優(yōu)先級(jí)的運(yùn)算符,結(jié)合次序由結(jié)合方向所決定。
簡(jiǎn)單記就是:! > 算術(shù)運(yùn)算符 > 關(guān)系運(yùn)算符 > && > || > 賦值運(yùn)算符
總結(jié)
以上是生活随笔為你收集整理的C语言优先级——取反和移位的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nordic系列芯片讲解九 (BLE事件
- 下一篇: ARM处理器型号