关闭

C-运算符优先级一个小例子

标签: C运算符优先级
407人阅读 评论(0) 收藏 举报
分类:

代码

比如有下面一段代码:

#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/C++运算符优先级

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:215463次
    • 积分:5732
    • 等级:
    • 排名:第4480名
    • 原创:375篇
    • 转载:14篇
    • 译文:0篇
    • 评论:19条
    文章分类
    最新评论