php - 嵌套三元运算符的优先顺序

标签 php operators

<分区>

前几天我在类里面展示了这段代码:

 <?php
 //Intialize the input
 $score=rand(50,100);
 //Determine the Grade
 $grade=($score>=90)?'A':(
 ($score>=80)?'B':(
 ($score>=70)?'C':(
 ($score>=60)?'D':'F')));
 //Output the Results
 echo "<h1>A score of $score = $grade</h1>";
 ?>

当时我质疑嵌套三元运算符的运算顺序,认为它们会从里到外求值,即如果$score>=60就先求值,如果$score>=70就先求值,等等——无论分数如何,每次都要完成整个堆栈。

在我看来,这个构造应该遵循与数学运算符相同的优先顺序——首先解析最里面的一组括号,然后再计算,除非存在某些特定于三元运算符的运算顺序。

不幸的是,类里面的讨论很快就变成了赢得争论,而我真的只是想了解它是如何运作的。所以我的问题有两个:

(1)我会如何解释这个陈述,为什么?

(2) 是否有某种堆栈跟踪或单步调试工具可以让我观察这段代码的执行情况?

最佳答案

PHP 尊重括号。最里面的 ( ... ) 中的表达式首先被求值,就像我们在小学时所学的那样。

PHP 的不寻常之处在于三元运算符是 left-associative .这意味着没有括号,三元表达式从左到右求值。

但在这种特殊情况下,括号强制从右到左计算表达式。此代码等效于:

if ($score >= 90) {
    $grade = 'A';
}
elseif ($score >= 80) {
    $grade = 'B';
}
elseif ($score >= 70) {
    $grade = 'C';
}
...

关于php - 嵌套三元运算符的优先顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25754133/

相关文章:

javascript - 如何通过javaScript/jquery从php获取多个返回值?

php - 将 mysqli 转换为 pdo bind_all

javascript - 如何将 PHP 循环转换为 JSON 循环?

c++ - 添加字符串时遇到问题... (c++)

objective-c - 了解按位与运算符

java - 运算符 & 未为类型( boolean 值、int)定义

java - Perl 的 qq 运算符在 Java 中的等价物是什么?

php - mysql中基于列ID的行名

PHP SQL Case when value like

C++:输入和输出流运算符:关联性