復合運算符
算術運算符后面加=號,便成為復合運算符
如:
i+=5;
相當於i=i+5;
那么i-=a+b;等價於什么?
注意:i*=a+b;並不等價於i=i*a+b,而是等價於i=i*(a+b)
+-*/%5個算術運算符都可以和=號組合成復合運算符,除此之外還有位運算符也可與=號組合成復合運算符。
逗號運算符
逗號運算符的運算順序為從左到右,計算結束后取最右邊的表達式作為運算結果。
如:
int a;
a=(3+5,4+6);
a的結果為10。
在循環中經常見到:
for(i=0;i<=100;s+=i,i++);
用這種方式計算1加到100的和,循環體可以省掉。
※逗號運算符的優先級是C語言中最低的,比=號還低。假設a=3,下面的逗號表達式:
b=(a=2+5,a*2)
會先算a=2+5,再算7*2,b的最終值是14,而不是3*2得6。
※逗號表達式出現在函數調用當中,很容易混淆,如:
func(rec1,rec2+rec3,(rec4,rec5));
該函數調用語句中實際上只有3個函數實參,(rec4,rec5)是個逗號表達式,取變量rec5的值作為實參,差別就在於這個括號。
※逗號是表達式,分號表示一條語句結束。
賦值表達式
int a=1,b=2,c,d;
if((c=a)<(d=b)){…}
if語句中,c=a表達式得到的結果為1,d=b得到的結果為2,相當於比較1<2,條件成立,會執行花括號中的語句。
※表達式int a=b=c=1+2;的真實運算順序如下:
int a=(b=(c=(1+2)));
※賦值表達式也可出現在函數中,如:
printf(“%d\n”,(n=5));
運算符結合性
單目運算符(++,--,!取反,&取址,*取值,正負號)、條件運算符(在后面講解)和=號(包括復合運算)結合性都是從右向左,其它運算符都是從左向右結合,如:
a=-i++相當於a=-(i++);
int a=b=c=1+2+3;
先算1+2是因為=號的優先級比+號低,先算后面的c=1+2是因為=號的運算符結合性是從右向左。
++和- -
i++等價於i=i+1
i--等價於i=i-1
++i表示i先自加1,再參與運算
如:
int i=2;
printf(“%d\n”,++i);
輸出3,i的值為3,這條printf語句可以分解為:
i=i+1;
printf(“%d\n”,i);
※注意i++和i+1的區別。
i++表示i先參與運算,再自加1
printf(“%d\n”, i++);
輸出2,但是i的值為3,它可以分解為:
printf(“%d\n”,i);
i=i+1;
※++和--只能作用於變量,不能作用於常量或表達式,如3++或(a+b)--都視為非法操作。因為++和--都會產生新值,常量或表達式都無法存放這個新值。
※如果遇見a+++b,編譯器會盡可能地從左到右組合運算符,把它變成(a++)+b,這和運算符結合性沒並有什么關系。如果你忘記了這條法則,可以自己使用括號控制運算順序。
設變量已正確定義為整型,則表達式n=i=2,++i,i++的值為____
// 17-1++運算符.c #include <stdio.h> main() { int n, i; //n = i = 2, ++i, i++; //這是一條語句 //printf("%d,%d\n", i, n); // 結果是:i = 4 n = 2 printf("%d\n",(n=i=2,++i,i++)); //結果是 i = 3 n = i = 2 中 i= 2, 然后 ++i i = 2 + 1 = 3 , 最后 輸出 i = 3 在執行 i = 3+1 }
// 17-2運算公式.c #include <stdio.h> #include <math.h> main() { int x; double a, b, c; x = (-b + (sqrt((pow(b, 2) - 4 * a *c)))) / (2 * a); }