编程语言运算符优先级的那些坑

6次阅读

共计 515 个字符,预计需要花费 2 分钟才能阅读完成。

作者:LogM

本文原载于 https://segmentfault.com/u/logm/articles,不允许转载~


1. 容易误记的几个运算符

以 C ++ 为例,容易误记优先级的运算符有如下几个:

  • 关系运算优先级高于位运算

    // 任务:a 和 b 求 "位与" 后,再判断等于 0
    
    // 错误写法
    if (a & b == 0) {...;}
    
    // 正确写法
    if ((a & b) == 0) {...;}
    
    // 这个例子非常经典,因为 linux 的内核曾经有一个 bug 就是这个原因造成的,// 虽然全世界有很多程序员在阅读内核代码,但是很长一段时间里,大家都没有发现这个错误。
  • 逻辑运算中 && 优先于 ||,位运算中 & 优先于 ^ 优先于 |

    if (a>c || a<b && d==e) {   // 这个判断逻辑是怎么样的?...;
    }
    
    z = a ^ b & c;  // 这条的计算顺序是怎么样的?

2. 不同语言优先级的差异

不同语言,运算符优先级不同,这是非常令人头疼的。比如 C++ 和 Python 的运算符优先级就不一样。

a | c ^ b == 0  // 你能说出这行代码分别在 C++ 和 Python 中的运算顺序吗?

所以,记不清运算符优先级时,建议多用括号。尤其对于有位运算和逻辑运算出现的代码,要特别留意。

3. 优先级表

C++ 运算符优先级

Python 运算符优先级

正文完
 0