C陷阱篇之运算符优先级

来源:互联网 发布:mysql 最近一条记录 编辑:程序博客网 时间:2024/04/24 03:42

    C语言运算符有不同优先级,标准里对这些优先级的规定基本符合人们的正常认知习惯,但其中还有个别容易混淆。其实也不需要死记硬背所有优先级,只要注意几个例外就可以了:

“+-””>>”运算符

    因为<<>>某些情况下相当于乘/除2n,很多人总认为它们的优先级也等于乘除而高于加减,但实际上位运算优先级比加减低。这跟惯常思维不一致,所以当移位加减一起用时一定要注意。比如有人把n*5写成“res=n<<2+n”,但由于n<<2位的优先级比加法低,结果实际变成“res = n<<(2+n)”,导致bug,要额外加括号改变默认计算顺序:res = (n<<2)+n;

运算符”==””!=” &^|&&||等的优先级

    == !=运算符优先级要高于 &^|&&||运算符,但我们一般倾向把==!=作为逻辑判断表达式的核心符号,由此形成的默认逻辑就是“先计算两边后进行逻辑判断”,这就错误地假设==!=优先级低于其他运算符。比如:

    void main()

    {

      if( 0 & 1 == 0)        printf("0 & 1 == 0\n");

      else     printf("0 & 1 != 0\n");

    }

    结果:0 & 1 != 0。不是某些人认为的:0 & 1 == 0。因为if( 0 & 1 == 0)相当于 if( 0 & (1 == 0) )所以执行了else分支。

    这里不想总结一堆规则去背诵,因为“淹死的多数会游泳”,死记硬背也免不了疏漏,不确定反而让人保持警惕。有了这份警惕,对不确定的优先级可以:

    1)分解长表达式:君子不立危墙之下,有简单安全的可用,干嘛自找麻烦呢?

    2)非要用长表达式的勤加括号:勤能补拙,安全第一嘛。
0 0
原创粉丝点击