很多程序员都有这样一个习惯,能用一个符号书写的代码不会多加一个符号,也正因为这样,我们写出来的代码往往在某些情况下会出现意料不到的结果。由于是我们书写时的不规范加上程序自身的容错性,往往没有明显的提示,因此出现这种意料之外的结果往往会让很多人陷入困惑,更有甚者会因这个纠结好长时间。
对于国内的很多开发者来说,很少有人能做到像老外那样严谨的书写代码。同样实现一个功能,我们可以对比一下国人书写的代码和老外书写的代码,相信看完两段代码的人就能深刻体会到笔者前面说的那句话了。
很多程序员都有这样一个习惯,能用一个符号书写的代码不会多加一个符号,也正因为这样,我们写出来的代码往往在某些情况下会出现意料不到的结果。由于是我们书写时的不规范加上程序自身的容错性,往往没有明显的提示,因此出现这种意料之外的结果往往会让很多人陷入困惑,更有甚者会因这个纠结好长时间。
这里有一段代码,相信很多人在第一时间给出的答案都和PHP程序执行完时输出的结果不一样。
- $a = 1;
- $b = 2;
- if ($a = 2 || $b = 4) {
- $a++;
- $b++;
- }
- 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就能看到结果。
最后,笔者提醒一下各位:书写代码要严谨,不要只顾自己,也要让其他阅读到该代码的人看的明明白白。该加括号的地方加上括号,该写注释的地方勤写注释。