本文主要是介绍C-运算符优先级一个小例子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
代码
比如有下面一段代码:
#include <stdio.h>int main()
{int a = 0x02;int b = 0x20;int ret = 0;const int MASK = 0x02;ret = a & MASK != MASK;printf("ret = %d\n", ret);ret = b & MASK != MASK;printf("ret = %d\n", ret);return 0;
}
关键点
主要关注如下代码块:
a & MASK != MASK
原作者的含义,估计是对一个数值进行掩码计算,然后判断是否为预期的这个掩码。从代码的层面讲,原作者认为是先做左边的&运算,再做右边的!=运算。
而从C的运算符优先级的角度来讲,上述代码等价于:
a & (MASK != MASK)
如此,易于知道这个计算的最终结果永远为0!
编译器版本
上述代码在VC6上编译无告警(不管编译高级改成哪个级别),而在VS2010(或其他VC6更高版本)上则有如下告警:
warning C4554: “&”: 检查运算符优先级可能存在的错误;使用圆括号阐明优先级
因为VC6上没有告警,所以上述问题会持续遗留在代码中。
正确的做法
在了解到运算符优先级之后,知道正确的写法应为:
(a & MASK) != MASK
另外,可以尝试加或不加括号,对比程序的执行结果。
附 K&R 2nd的运算符优先级
这篇关于C-运算符优先级一个小例子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!