$a = 1;
echo $a == 1 ? 2 : $a == 1 ? 3 : 4 ;
这段代码的输出为什么是 3 呢? 同样的三目运算符级联,用 JavaScript 写结果就是 2...
$a = 1;
echo $a == 1 ? 2 : $a == 1 ? 3 : 4 ;
这段代码的输出为什么是 3 呢? 同样的三目运算符级联,用 JavaScript 写结果就是 2...
这是2个三目运算的合体
$a == 1 ? 2 : $a == 1 ? 3 : 4 ;
$a == 1 ? 2 : $a == 1 这是第一段三目值是2
2 ? 3:4 结果就是3;
纠结这种运算符优先级的问题没什么意义,看manual就知道了 Operator Precedence
由于==
的优先级最高,所以$a == 1 ? 2 : $a == 1 ? 3 : 4
等同于true ? 2 : true ? 3 : 4
由于?:
是左结合的
所以true ? 2 : true ? 3 : 4
等同于(true ? 2 : true) ? 3 : 4
同理, javascript中?:
是右结合的
基础的运算符优先级RTFM
相同的运算符优先级,运算符? :的结合方向是左,所以整个运算式从左依次运算,相当于
($a == 1 ? 2 : $a == 1) ? 3 : 4 ;
1 回答4.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
2 回答2.2k 阅读
1 回答1.4k 阅读✓ 已解决
796 阅读
647 阅读
哎,这个是PHP的三目运算符比较特殊:
PHP的
?:
是从左到右结合的:$a == 1 ? 2 : $a == 1 ? 3 : 4
等价于($a == 1 ? 2 : $a == 1) ? 3 : 4
JavaScript的
?:
是从右到左结合的:$a == 1 ? 2 : $a == 1 ? 3 : 4
等价于$a == 1 ? 2 : ($a == 1 ? 3 : 4)
所以呢,多加点括号吧。反正多加括号一般不会有什么影响。
参考:
PHP 运算符优先级
运算符优先级 - JavaScript - MDN
看看常见语言的
?:
三目运算符的结合顺序:(就PHP奇葩)C: 从右到左
C++: 从右到左
Java: 从右到左
PHP: 从左到右
JavaScript: 从右到左
C#: 从右到左
Object-C: 从右到左
Swift: 从右到左