Table 0. 為什么要掌握優(yōu)先級(jí) 1. 優(yōu)先級(jí) 1.1 優(yōu)先級(jí)圖表 1.2 運(yùn)算符實(shí)例 1.3 優(yōu)先級(jí)順口溜 2. 結(jié)合性 3. 參考資料 Link:http://blog./space. ... blog&id=2880933 寫代碼的時(shí)候,常會(huì)翻看的一個(gè)表就是“c語(yǔ)言運(yùn)算符優(yōu)先級(jí)表”。c的運(yùn)算符優(yōu)先級(jí)常常很讓人頭疼。其實(shí),在大學(xué)里學(xué)習(xí)c的時(shí)候,老師告訴大家這個(gè)不用一定背下來(lái),用的時(shí)候可以找書,或者加小括號(hào)就可以了。我聽了,但是后來(lái)發(fā)現(xiàn)錯(cuò)了。很多人都聽了,但不是每個(gè)人都發(fā)現(xiàn)這是錯(cuò)的。以至于有人覺(jué)得把優(yōu)先級(jí)背下來(lái)是“沒(méi)事閑的”(http://zhidao.baidu.com/question/155120432.html?an=0&si=1)。 0. 為什么要掌握優(yōu)先級(jí) 想想這兩個(gè)問(wèn)題: a. 讀別人的代碼,遇到優(yōu)先級(jí)問(wèn)題看不懂,怎么辦? b. 一堆的括號(hào),美觀嗎? 本想貼一張畫來(lái)裝飾墻壁,卻用了一堆紙來(lái)固定! 有人說(shuō)代碼寫多了,自然就會(huì)了。這個(gè)是很寬泛的說(shuō)法。看你寫的代碼的水準(zhǔn),有些東西可能你一直都接觸不到,何談熟練。有些東西一定要梳理,總結(jié)。 1. 優(yōu)先級(jí) 1.1 優(yōu)先級(jí)圖表 優(yōu)先級(jí)最高者不是真正意義上的運(yùn)算符,包括:數(shù)組下標(biāo),函數(shù)調(diào)用,結(jié)構(gòu)體成員選擇符。 單目運(yùn)算符的優(yōu)先級(jí)次之。(! ~ ++ -- - (type) * & sizeof) 然后是雙目運(yùn)算符。雙目運(yùn)算符里, 算數(shù)運(yùn)算符(* / % + -)優(yōu)先級(jí)最高, 移位(<< >>)次之, 關(guān)系運(yùn)算符(< <= > >= != ==)再次之, 接著是位運(yùn)算符(& ^ | ),邏輯運(yùn)算符(&& ||) 條件運(yùn)算符(?: 三目),賦值運(yùn)算符(= ...)。 任何一個(gè)邏輯運(yùn)算符的優(yōu)先級(jí)低于任何一個(gè)關(guān)系運(yùn)算符。 移位運(yùn)算符的優(yōu)先級(jí)比算數(shù)運(yùn)算符要低,但是比關(guān)系運(yùn)算符要高。 1.2 運(yùn)算符實(shí)例 a. while (c = getc(in) != EOF) putc(c, out) 循環(huán)的意思是復(fù)制一個(gè)文件到另一個(gè)文件。但是由于!=的優(yōu)先級(jí)比賦值運(yùn)算符的優(yōu)先級(jí)高,所以c被賦予了getc()的返回值與EOF比較后的布爾值,結(jié)果向out中寫入了一堆1. b. 解釋下面幾個(gè)聲明
常常被錯(cuò)誤的理解為指向字符數(shù)組的指針。 正確的是p一個(gè)數(shù)組,里面元素是指向字符的指針類型。 char (*p)[] p是指向指向字符數(shù)組的指針。 int *fp() 常常錯(cuò)誤理解為函數(shù)指針,該函數(shù)返回int類型。 正確的是fp是一個(gè)函數(shù),他返回一個(gè)執(zhí)行int的指針。 int (*fp)() fp是函數(shù)指針,該函數(shù)返回int類型。 c. 解釋下面的表達(dá)式
對(duì)p去f偏移,作為指針,然后進(jìn)行解引用。相當(dāng)與*(p.f),因?yàn)?的優(yōu)先級(jí)高與*。比較(*p).f。 val & mask != 0 相當(dāng)與val & (mask != 0). max = val1 > val2 ? val1 : val2 相當(dāng)與 max = (val1 > val2 ? val1 :val2). d. 一個(gè)復(fù)雜的聲明
c是一個(gè)數(shù)組,里面放10指針,后面緊跟這一個(gè)括號(hào),所以這些指針是函數(shù)指針。 2. 關(guān)注第二個(gè)括號(hào),(int **p) 顯然p是函數(shù)的參數(shù),它是個(gè)指向指針的指針。 3. 這看最前面的* char *說(shuō)明該函數(shù)的返回值是一個(gè)指向字符的指針。 4. 這個(gè)聲明的意思就是:c是一個(gè)數(shù)組,里面有10個(gè)函數(shù)指針,指向的函數(shù)返回指針,指向字符,函數(shù)的參數(shù)是指向int類型指針的指針。 1.3 優(yōu)先級(jí)順口溜 醋壇酸味灌 味落跳福豆 共44個(gè)運(yùn)算符 醋-初等,4個(gè): ( ) [ ] -> 指向結(jié)構(gòu)體成員 . 結(jié)構(gòu)體成員 壇-單目,9個(gè): ! ~ ++ -- -負(fù)號(hào) (類型) *指針 &取地址 sizeof長(zhǎng)度 酸-算術(shù),5個(gè): * / % + -減 味-位移,2個(gè): << >> 灌-關(guān)系,6個(gè): < <= > >= == 等于 != 不等于 味-位邏,3個(gè): & 按位與 ^ 按位異或 | 按位或 落-邏輯,2個(gè): && 邏輯與 || 邏輯或 跳-條件,1個(gè),三目: ? : 福-賦值,11個(gè): = += -= *= /= %= >>= <<= &= ^= |= 豆-逗號(hào),1個(gè): , 2. 結(jié)合性 在標(biāo)準(zhǔn)C語(yǔ)言的文檔里,對(duì)操作符的結(jié)合性并沒(méi)有作出非常清楚的解釋。一個(gè)滿分的回答是:它是仲裁者,在幾個(gè)操作符具有相同的優(yōu)先級(jí)時(shí)決定先執(zhí)行哪一個(gè)。 看例子:
同級(jí)的操作符,結(jié)合性相同。如果在計(jì)算表達(dá)式的值時(shí)候需要考慮結(jié)合性,那么最好把這個(gè)表達(dá)式一分為二。 3. 參考資料 《c Traps and Pitfalls》 Andrew Koenig著, ISBN 978-7-115-17179-5 《c 專家編程》 Peter Van Der Linden 著, ISBN 978-7-115-17180-1 順口溜 http://blog.sina.com.cn/s/blog_4e64e2290100be0z.html |
|
來(lái)自: 敬而遠(yuǎn) > 《C/Cplusplus》