1、標(biāo)識(shí)符、常量、字符串和用()括號(hào)套起來的表達(dá)式是組成表達(dá)式的最基本單元,在運(yùn)算中做
操作數(shù),優(yōu)先級(jí)最高。
2、后綴運(yùn)算符,包括數(shù)組取下標(biāo)[]、函數(shù)調(diào)用()、結(jié)構(gòu)體取成員.、指向結(jié)構(gòu)體的指針取成員->、后綴自增++、后綴自減--。如果一個(gè)操作數(shù)后面有多個(gè)后綴,按照離操作數(shù)從近到遠(yuǎn)的順序
(也就是從左到右)依次運(yùn)算,比如 a.name++ ,先算 a.name ,再++,這里的 .name 應(yīng)該看成 a 的
一個(gè)后綴,而不是把 . 看成雙目運(yùn)算符。
3、單目運(yùn)算符,包括前綴自增++、前綴自減--、 sizeof 、類型轉(zhuǎn)換()、取地址運(yùn)算&、指針間接尋址、正號(hào)+、負(fù)號(hào)-、按位取反~、邏輯非! 。如果一個(gè)操作數(shù)前面有多個(gè)前綴,按照離操作數(shù)從近到遠(yuǎn)的順序(也就是從右到左)依次運(yùn)算,比如 !~a ,先算 ~a ,再求!。
4、乘、除/、模%運(yùn)算符。這三個(gè)運(yùn)算符是左結(jié)合的。
5、加+、減-運(yùn)算符。左結(jié)合。
6、移位運(yùn)算符<<和>>。左結(jié)合。
7、關(guān)系運(yùn)算符< > <= >=。左結(jié)合。
8、相等性運(yùn)算符==和!=。左結(jié)合。
9、按位與&。左結(jié)合。
10、按位異或^。左結(jié)合。
11、按位或|。左結(jié)合。
12、邏輯與&&。左結(jié)合。
13、邏輯或||。左結(jié)合。
14、條件運(yùn)算符:?。在第 2 節(jié) “if/else語句”講過Dangling-else問題,條件運(yùn)算符也有類似的問
題。例如 a ? b : c ? d : e 是看成 (a ? b : c) ? d : e 還是 a ? b : (c ? d : e) ?C語言規(guī)
定是后者。
15、賦值=和各種復(fù)合賦值( *= /= %= += -= <<= >>= &= ^= |= )。右結(jié)合。
16、逗號(hào)運(yùn)算符,左結(jié)合。
以下代碼查找和打印0~1024之間所有256的倍數(shù),對(duì)嗎?
int i = 0;
for (; i <= 1024; ++i)
{
if (i & 0xff == 0)
{
printf("%d\n",i);
}
}
不對(duì),因?yàn)?優(yōu)先級(jí)比&高。,所以應(yīng)改成if ((i & 0xff )== 0)
tip:在標(biāo)準(zhǔn)C語言的文檔里,對(duì)操作符的結(jié)合性并沒有做出非常清楚的解釋。一個(gè)滿分的回答是:它是仲裁者,在幾個(gè)操作符具有相同的優(yōu)先級(jí)時(shí)決定先執(zhí)行哪一個(gè)。
int a,b=1,c=2;
a=b=c;
所有的賦值符(包括復(fù)合賦值)都具有右結(jié)合性,就是在表達(dá)式中最右邊的操作最先執(zhí)行,然后從右到左依次執(zhí)行。這樣,c先賦值給b,然后b在賦值給a,最終a的值是2。類似地,具有左結(jié)合性的操作符(如位操作符“&”和“|”)則是從左至右依次執(zhí)行。結(jié)合性只用于表達(dá)式中出現(xiàn)兩個(gè)以上相同優(yōu)先級(jí)的操作符的情況,用于消除歧義。C語言中具有右結(jié)合性的運(yùn)算符包括所有單目運(yùn)算符以及賦值運(yùn)算符(=)和條件運(yùn)算符。其它都是左結(jié)合性。判斷表達(dá)式計(jì)算順序時(shí),先按優(yōu)先級(jí)高的先計(jì)算,優(yōu)先級(jí)低的后計(jì)算,當(dāng)優(yōu)先級(jí)相同時(shí)再按結(jié)合性,或從左至右順序計(jì)算,或從右至左順序計(jì)算。