左,还是右
入门。
大多数编程语言都提供条件运算符(ternary operator),写做a ? b : c
,如果a
为true
,返回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