C/C++|c语言中运算符的优先级

最近看了本叫《C陷阱与缺陷》(C traps and pitfalls)的书。
书中对运算符的优先级讲的很清楚:为了便于复习,今天就回忆一下了:


当然至高无上的是(),
最高优先级的是: (),[] , . , ->,
(它们分别是函数符号,数组下标符号,成员符号) ,结合性从左往右;
其次,单目运算符:!,~,++, --, - (type)*, &, sizeof结合性从右往左;
再次,算术运算法:* 、/、%结合性从左往右;
再次:+、-结合性从左往右;
再次,移位运算符: <<, >>, >>>结合性从左往右;
再次, 比较运算符: <, <=, >, >=结合性从左往右;
再次:==, !=结合性从左往右;
再次, 逻辑运算符:
首先,按位运算符: &, ^, | ,且&优先于^ ,^优于 |结合性从左往右;
其次,逻辑运算符&&, ||,且&&优于||。结合性从左往右;


接着是, 三目运算符:? :结合性从右往左;
其次是, 赋值运算符: =结合性从右往左;
【C/C++|c语言中运算符的优先级】最后是,逗号运算符: ,结合性从左往右;


总结:要记住:
1.比较运算符优于逻辑运算符
2.移位运算符介于算术运算符和比较运算符之间
3.除单目运算符外,算术运算符的优先级最高。


下面看一个关于++,--的有趣的小例子:
#include int main(void) { int a; int b =3; int c = 4; a = --b + b++ + c + b--; // ++等单目运算符的结合性是从右往左,等式等价于a = --b + (b++) + c + b--; printf("%d/n", a); // a = 2 + 2 + 4 + 2; //前置运算是在等式的所有的计算前计算,后置计算是在等式的所有的计算完之后计算; b = 3; c = 4; a = --b + b + (++c) + b--; //a=11 = 2 + 2 +5 + 2; printf("%d/n", a); b = 3; c = 4; a = --b + (b++) + c + b--; // a = 2 + 2 + 4 + 2; printf("%d/n", a); //a=10 return 0; }


从上面可以看出:前置的++,--是在整个等式运算之前计算,而后置的++,--是在整个等式计算之后运算。


看看下面的代码是不是很明了:

void strcpy(char* dest, const char* src){ int i = 0; while( (dest[i++]=src[i++]) != '/0'); }




void strcpy(char* dest, const char* src){ int i = 0; while( dest[i++]=src[i++] ); }

void strcpy(char* dest, const char* src){ while( *(dest++) = *(src++) ); }





void strcpy(char* dest, const char* src){ while(*dest++=*src++); }




    推荐阅读