【问题标题】:Operator Precedence in PHP: Ternary XOR AssignmentPHP 中的运算符优先级:三元异或赋值
【发布时间】:2010-07-15 22:19:18
【问题描述】:

写完我对how to assign to multiple variables in a ternary operator问题的回复后,我实际上尝试了我写的代码:

true ? $w = 100 xor $r = 200 : $w = 300 xor $r = 400;
var_dump($w); var_dump($r);

(别管它没用,这是理论上的。)

现在,根据operator precedence,我希望 PHP 会这样做:

 true  ?   $w = 100  xor  $r = 200   :   $w = 300  xor  $r = 400  ;
(true) ? ( $w = 100  xor  $r = 200 ) : ( $w = 300  xor  $r = 400 );
(true) ? (($w = 100) xor ($r = 200)) : (($w = 300) xor ($r = 400));

当计算三元运算符的第一部分时,应该输出:

int 100
int 200

但是我得到了

int 100
int 400

这对我来说很奇怪,因为它需要执行 三元运算符的两个部分

假设这是我的想法有问题。

【问题讨论】:

    标签: php operator-precedence


    【解决方案1】:

    你不是在做吗

    (true ? $w = 100 xor $r = 200 : $w = 300) xor $r = 400;
    

    【讨论】:

    • 就像没有大括号的单命令 for 循环,有人将第二个命令标记到其中,并发现它在最后只执行了一次。哎呀。
    • 这是有道理的,我认为 PHP 将最后一个 xor 放在运算符之外。与计算器一样,您需要在所有内容周围加上括号
    • 跟随你到 php.net 的链接,它就在那里,xor 优先级低于?: QED。
    • 我最喜欢的是 C 语言中括号太少的宏,例如 #define AVERAGE(x,y) x/2+y/2,然后评估 AVERAGE(10,1)*2。哦,快乐。使用小写时更好,因此宏提示甚至不存在。
    • 该死,你完全正确。我总是被三元组困住。 @C:是的,我知道。但是对于 C 来说,以某种方式将宏和所有变量都用括号括起来是一种做法。在 PHP 中,我习惯于不使用它们。有时适得其反……
    【解决方案2】:

    我根本不会以这种方式使用三元运算符。当您需要整个表达式返回一个值时使用三元运算符,而不是作为逻辑代码结构的替代品。

    例如:

    if (true) {
      $w = 100;
      $r = 200;
    } else {
      $w = 300;
      $r = 400;
    }
    
    var_dump($w); 
    var_dump($r);
    

    使用 if/else 构造的优点:

    • 更易于阅读、更易于维护、更易于调试。
    • 如果需要,可以更轻松地在每个条件块内添加更多步骤。
    • 如果您使用代码覆盖工具运行测试,当您的所有代码不在一行时,您可以更准确地了解正在测试的代码路径。
    • 您无需向 Stack Overflow 发布问题即可使其正常工作!

    使用三元运算符的优点:

    • 使用更少的花括号和分号,以防您用完它们或在键盘上找不到它们。

    【讨论】:

    • 是的,我从没想过要使用它。这个问题纯粹是理论上的;)但是,你说的是:在我的德语键盘上,我必须按Alt Gr + 7 才能打开一个花括号......很复杂,不是吗?
    • 点了。在许多国家键盘布局中,需要Alt Gr 才能访问大括号和编程语言中常见的其他字符。
    猜你喜欢
    • 2015-08-24
    • 1970-01-01
    • 2018-08-14
    • 2013-03-27
    • 2018-09-28
    • 2023-03-07
    • 2017-06-20
    相关资源
    最近更新 更多