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

原创 2016年08月30日 17:14:59

代码

比如有下面一段代码:

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

相关文章推荐

eclipse编码格式(优先级)

eclipse中文显示乱码问题总结

运算符优先级一则小案例

遇到好的案例总是有必要记录下来的。规则书上明明白白写着,但教科书上基本上很少给出一些案例。...

一个例子让你明白C++的运算符优先级

算术运算符 关系运算符 赋值运算符   这是她们的优先级   借助这个例子就会记住啦:             int a=1,b=1,c=0;             c= a+b=...
  • bailu66
  • bailu66
  • 2012年03月30日 17:39
  • 939

Lex与Yacc学习(八)之变量和有类型的标记(扩展计算器)

变量和有类型的标记 下一步扩展计算器来处理具有单个字母名字的变量,因为只有26个字母 (目前只关心小写字母),所以我们能在26个条目的数组(称它为vbltable)中存储变量。 为了使得计算器更加...
  • fly_yr
  • fly_yr
  • 2015年01月22日 10:31
  • 1907

Lex Yacc (四) 实际应用全代码

修改后的实际应用全代码 草木瓜(七) 精读 源代码有百度云存盘 复杂的逻辑判断简化成程序判断语句,可便于应用的扩展和维护,也极大增强了代码的可读性。 我们对整体文件划分如下: tre...

c运算符优先级

  • 2013年04月04日 00:05
  • 3.7MB
  • 下载

运算符优先级,c c++

  • 2011年12月28日 11:04
  • 104KB
  • 下载

我的c学习:算术运算符与算术表达式 优先级

除法运算 / 两个整数相除结果为整数 如:5/3=1 “向零取整”:-5/3的结果为-1模运算/取余运算 % %两侧均为整型数据 如7%4的结果为3 如何让10+...

C运算符的优先级

  • 2012年11月05日 16:02
  • 14KB
  • 下载

c中运算符的优先级排列

  • 2011年06月02日 18:26
  • 15KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C-运算符优先级一个小例子
举报原因:
原因补充:

(最多只允许输入30个字)