左,还是右

Updated: 2019-01-01

入门

大多数编程语言都提供条件运算符(ternary operator),写做a ? b : c,如果atrue,返回b,否则返回c

坑!

如果条件比较复杂,例如有三种结果,可以用嵌套的条件运算符:

jshell> int n = 0;
n ==> 0

jshell> (n == 0) ? "zero" : (n == 1) ? "one" : "many";
$2 ==> "zero"

但如果你用的是 PHP,你看到的确是...

php > $num = 0;
php > print ($num === 0) ? 'zero' : ($num === 1) ? 'one' : 'many';
one

进阶

C/Java 中,条件运算符是右结合的,所以会先算(n == 1) ? "one" : "many",返回one,然后再判断(n == 0) ? "zero" : "one",所以结果是正确的zero

而 Hack/PHP 中是左结合的,会先判断($num === 0) ? 'zero' : ($num === 1),得到zero,再'zero' ? 'one' : 'many', 因为是个非空字符串,所以返回one

一个良好的编程习惯是适当的加上括号:

php > print ($num === 0) ? 'zero' : (($num === 1) ? 'one' : 'many');
zero