扫码关注官方订阅号
$a = 1; echo $a == 1 ? 2 : $a == 1 ? 3 : 4 ;
这段代码的输出为什么是 3 呢? 同样的三目运算符级联,用 JavaScript 写结果就是 2...
认证高级PHP讲师
哎,这个是PHP的三目运算符比较特殊:
PHP的?:是从左到右结合的: $a == 1 ? 2 : $a == 1 ? 3 : 4 等价于 ($a == 1 ? 2 : $a == 1) ? 3 : 4
?:
$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)
$a == 1 ? 2 : ($a == 1 ? 3 : 4)
所以呢,多加点括号吧。反正多加括号一般不会有什么影响。
参考:
PHP 运算符优先级
运算符优先级 - JavaScript - MDN
看看常见语言的?:三目运算符的结合顺序:(就PHP奇葩)
C: 从右到左
C++: 从右到左
Java: 从右到左
PHP: 从左到右
JavaScript: 从右到左
C#: 从右到左
Object-C: 从右到左
Swift: 从右到左
这是2个三目运算的合体
$a == 1 ? 2 : $a == 1 ? 3 : 4 ;$a == 1 ? 2 : $a == 1 这是第一段三目值是22 ? 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等同于(true ? 2 : true) ? 3 : 4
(true ? 2 : true) ? 3 : 4
同理, javascript中?:是右结合的
基础的运算符优先级RTFM
相同的运算符优先级,运算符? :的结合方向是左,所以整个运算式从左依次运算,相当于
($a == 1 ? 2 : $a == 1) ? 3 : 4 ;
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
哎,这个是PHP的三目运算符比较特殊:
PHP的
?:是从左到右结合的:$a == 1 ? 2 : $a == 1 ? 3 : 4等价于($a == 1 ? 2 : $a == 1) ? 3 : 4JavaScript的
?:是从右到左结合的:$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: 从右到左
这是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 ;