c语言中运算符的优先级

来源:互联网 发布:手机广告声音制作软件 编辑:程序博客网 时间:2024/05/16 09:02

最近看了本叫《C陷阱与缺陷》(C traps and pitfalls)的书。

书中对运算符的优先级讲的很清楚:为了便于复习,今天就回忆一下了:


当然至高无上的是(),

最高优先级的是: (),[] , . , ->, 

(它们分别是函数符号,数组下标符号,成员符号) ,               结合性从左往右;

其次,单目运算符:  !,~,  ++, --, - (type)  *, &, sizeof   结合性从右往左;

再次,算术运算法:  * 、/、%                                  结合性从左往右;

再次:    +、-                                                结合性从左往右;

再次,移位运算符: <<, >>, >>>                                结合性从左往右;

再次, 比较运算符: <, <=, >, >=                               结合性从左往右;

再次:              ==, !=                                   结合性从左往右;

再次, 逻辑运算符:           

          首先,按位运算符: &, ^, | ,  且&优先于^ ,^优于 |    结合性从左往右;

          其次,逻辑运算符  &&, ||,  且&&优于||。             结合性从左往右;


接着是, 三目运算符:? :                                      结合性从右往左;

其次是, 赋值运算符: =                                       结合性从右往左;

最后是,逗号运算符: ,                                        结合性从左往右; 


总结:要记住: 

1.比较运算符优于逻辑运算符

        2.移位运算符介于算术运算符和比较运算符之间

        3.除单目运算符外,算术运算符的优先级最高。

下面看一个关于++,--的有趣的小例子:


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


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

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++);}