C-运算符优先级一个小例子
2016-08-30 17:14
288 查看
代码
比如有下面一段代码:#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语言声明的优先级规则(一个复杂的例子)
- java中线程优先级是怎么回事给出一个例子
- openssl之EVP系列之9---EVP_Digest系列函数的一个例子
- 做一个返回数组的函数(例子)
- 关于Java的RMI编程的一个简单的例子
- 一个简单例子表示fixed functional VS/Assemble VS/HLSI VS的例子
- 一个功能齐全的DataGrid分页例子
- 一个简单的tcp filter的例子
- 一个编译器所支持的异步委托的例子
- 一个成功的增量SNAPSHOT 例子
- 非阻塞方式下Socket读取数据的一个例子
- 使用JSP + JAVABEAN + XML 开发的一个例子
- 今天没事,看到一个用C#开发OutLook插件的例子,顺便自己做了一个