C陷阱篇之运算符优先级

    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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值