复合运算符
算术运算符后面加=号,便成为复合运算符
如:
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); }