最近看了本叫《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++);
}
推荐阅读
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- C/C++|C/C++ basis 02
- Qt实战|Qt+OpenCV联合开发(二十一)--图像翻转与旋转
- Qt实战|Qt+OpenCV联合开发(十四)--图像感兴趣区域(ROI)的提取
- Qt实战|Qt+OpenCV联合开发(十三)--通道分离与合并
- opencv|Qt+OpenCV联合开发(十六)--图像几何形状绘制
- Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色
- SNAT的MASQUERADE地址选择与端口选择
- IPTABLES的连接跟踪与NAT分析
- IPVS分析