运算符优先级的问题

摘要

很多程序员都有这样一个习惯,能用一个符号书写的代码不会多加一个符号,也正因为这样,我们写出来的代码往往在某些情况下会出现意料不到的结果。由于是我们书写时的不规范加上程序自身的容错性,往往没有明显的提示,因此出现这种意料之外的结果往往会让很多人陷入困惑,更有甚者会因这个纠结好长时间。

对于国内的很多开发者来说,很少有人能做到像老外那样严谨的书写代码。同样实现一个功能,我们可以对比一下国人书写的代码和老外书写的代码,相信看完两段代码的人就能深刻体会到笔者前面说的那句话了。

很多程序员都有这样一个习惯,能用一个符号书写的代码不会多加一个符号,也正因为这样,我们写出来的代码往往在某些情况下会出现意料不到的结果。由于是我们书写时的不规范加上程序自身的容错性,往往没有明显的提示,因此出现这种意料之外的结果往往会让很多人陷入困惑,更有甚者会因这个纠结好长时间。

这里有一段代码,相信很多人在第一时间给出的答案都和PHP程序执行完时输出的结果不一样。

  1. $a = 1;
  2. $b = 2;
  3. if ($a = 2 || $b = 4) {
  4.     $a++;
  5.     $b++;
  6. }
  7. echo '$a = ' . $a . '; $b = ' . $b;  // 输出结果是:$a = 1; $b = 3

相信很多人,看到这个结果会陷入困惑。为什么不是$a = 3; $b = 3呢?

原因在于:运算符的优先级

1、逻辑或运算符(即||) 比赋值运算符(即=)优先级高;

2、逻辑或运算符(即||) 是从左到右结合的,遇到真就直接返回true,不会再看后面的。

分析过程:因为优先级的原因,PHP在运行的过程中会优先处理2 || $b = 4。 程序只需要执行到左边的2,就得出该表达式为真,随即返回布尔值true,$b = 4将不再执行(||遇到真就直接返回true,不会再看后面的),然后再将布尔值true赋值给$a,此时的$b为初始化的2,最后再执行花括号里的操作。要注意的是++、--对于布尔值无效,因此花括号里的操作执行完后$a = true; $b = 3。当最后echo的时候,由于true被隐式转换成了1,所以最终输出结果是$a = 1; $b = 3。

有人可能会怀疑,你说花括号里的操作执行完后$a等于true就等于true,我不信。要证明这个并不难,我们可以在echo之前用var_dump输出一下$a就能看到结果。

最后,笔者提醒一下各位:书写代码要严谨,不要只顾自己,也要让其他阅读到该代码的人看的明明白白。该加括号的地方加上括号,该写注释的地方勤写注释。

shaw

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: