C/CPP運(yùn)算優(yōu)先級(jí)的坑及解決
C/CPP運(yùn)算優(yōu)先級(jí)坑
1. 位運(yùn)算優(yōu)先級(jí)低于比較運(yùn)算符
做leetcode時(shí)遇到的,判斷一個(gè)數(shù)某一比特位是否為0。
if ( val & 2 == 0) {
// do someting...
}萬(wàn)萬(wàn)沒(méi)想到&運(yùn)算符的優(yōu)先級(jí)是低于==的,debug了好久,得加上括號(hào)。
1.1 驗(yàn)證
#include <iostream>
int main( int argc, char *argv[]){
int val = 2;
if ( val & 1 == 0) {
std::cout << "without (): bit 1 is 0" << std::endl;
}
else {
std::cout << "without (): bit 1 is 1" << std::endl;
}
if ( (val & 1) == 0) {
std::cout << "with (): bit 1 is 0" << std::endl;
}
else {
std::cout << "with (): bit 1 is 0" << std::endl;
}
return 0;
}輸出結(jié)果為
without (): bit 1 is 1
with (): bit 1 is 0
2. 移位運(yùn)算符優(yōu)先級(jí)低于算術(shù)運(yùn)算符
這是在寫(xiě)二分的時(shí)候遇到的, l + (r-l) >> 1 的值永遠(yuǎn)為r >> 1
應(yīng)該寫(xiě)作l + (r - l >> 2)。
2.1 驗(yàn)證
#include <iostream>
int main( int argc, char *argv[]){
int l = 2, r = 8;
int mid = l + (r - l) >> 1;
int mid2 = l + ( r - l >> 1);
std::cout << "mid: " << mid << std::endl;
std::cout << "mid2: " << mid2 << std::endl;
return 0;
}輸出結(jié)果為
mid: 4
mid2: 5
C語(yǔ)言運(yùn)算優(yōu)先級(jí)口訣
C語(yǔ)言常用運(yùn)算符的優(yōu)先級(jí)口訣是:“單算關(guān)邏條賦逗”;
如果加入位運(yùn)算符,完整口訣是:“單算移關(guān)與,異或邏條賦”。
- “單”表示單目運(yùn)算符:邏輯非(!),按位取反(~),自增(++),自減(--),取地址(&),取值(*);
- “算”表示算術(shù)運(yùn)算符:乘、除和求余(*,/,%)級(jí)別高于加減(+,-);
- “移”表示按位左移(<<)和位右移(>>);
- “關(guān)”表示關(guān)系運(yùn)算符:大小關(guān)系(>,>=,<,<=)級(jí)別高于相等不相等關(guān)系(==,!=);
- “與”表示按位與(&);
- “異”表示按位異或(^);
- “或”表示按位或(|);
- “邏”表示邏輯運(yùn)算符:邏輯與(&&)級(jí)別高于邏輯或(||);
- “條”表示條件運(yùn)算符(? :);
- “賦”表示賦值運(yùn)算符(=,+=,-=,*=,/=,%=,>>=,<<=,&=,^=, |=,!=);
另,逗號(hào)運(yùn)算符(,) 級(jí)別最低,口訣中沒(méi)有表述,需另加記憶..
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++強(qiáng)制類型轉(zhuǎn)換詳細(xì)示例代碼
在C++中,強(qiáng)制類型轉(zhuǎn)換(Type Casting)是將一種數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型的操作,這篇文章主要介紹了C++強(qiáng)制類型轉(zhuǎn)換的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-09-09
C語(yǔ)言中改變目錄的相關(guān)操作函數(shù)詳解
這篇文章主要介紹了C語(yǔ)言中改變目錄的相關(guān)操作函數(shù)詳解,分別是fchdir()函數(shù)和rewinddir()函數(shù)的使用方法,需要的朋友可以參考下2015-09-09
用代碼和UML圖化解設(shè)計(jì)模式之橋接模式的深入分析
本篇文章是對(duì)橋接模式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C/C++中使用局部/全局變量初始值或默認(rèn)值問(wèn)題
這篇文章主要介紹了C/C++中使用局部/全局變量初始值或默認(rèn)值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
C語(yǔ)言的動(dòng)態(tài)內(nèi)存管理的深入了解
這篇文章主要為大家詳細(xì)介紹了語(yǔ)言C的動(dòng)態(tài)內(nèi)存管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單職工信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單職工信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07

