三元运算符的右结合性

Jay*_*Yay 0 c++ operators operator-precedence associativity

std::cout << (true ? "high pass" : false ? "fail" : "pass")
Run Code Online (Sandbox Code Playgroud)

是相同的

std::cout << (true ? "high pass" : (false ? "fail" : "pass"))
Run Code Online (Sandbox Code Playgroud)

既然三元运算符是右结合的,为什么我们不先进行右运算呢?不应该pass打印而不是high pass

phu*_*clv 5

您误解了运算符结合性这只是将具有相同优先级的运算符分组的方法,并且不会以任何方式影响计算顺序。所以cond1 ? 1 : cond2 ? 2 : cond3 ? 3 : 4会被解析为

cond1 ? 1 : (cond2 ? 2 : (cond3 ? 3 : 4))
Run Code Online (Sandbox Code Playgroud)

从右边开始,而不是像

((cond1 ? 1 : cond2) ? 2 : cond3) ? 3 : 4
Run Code Online (Sandbox Code Playgroud)

它从左侧对操作数进行分组。一旦“添加”括号,表达式将按正常顺序求值

事实上,PHP 将三元运算符设为左关联,这是其最大的错误之一,而且目前无法修复。请参阅了解嵌套 PHP 三元运算符
更新: 三元运算符的左关联性已在 PHP 7.4 中弃用,并在 PHP 8.0 中删除