代码之家  ›  专栏  ›  技术社区  ›  stormdrain

是否可以用一个三元运算符设置多个变量?

  •  2
  • stormdrain  · 技术社区  · 14 年前

    我想看看是否可以用一个三元运算符设置多个变量。我在谷歌上搜索了一下,但什么也没找到。我开始测试一些想法,发现了一些相近的东西——但也有一些奇怪的行为;你知道发生了什么事吗?有没有可能设置多个 var

    $i=9;
    ($i==9)?($w=3|$r=2):($w=7|$r=1);
    echo 'w= '.$w.' r= '.$r;//w= 3 r= 2
    
    
    $i=9;
    ($i==9)?($w=4|$r=2):($w=7|$r=1);
    echo 'w= '.$w.' r= '.$r;//w= 6 r= 2
    
    
    $i=9;
    ($i==9)?($w=3|$r=7):($w=7|$r=1);
    echo 'w= '.$w.' r= '.$r;//w= 7 r= 7
    
    
    $i=444;
    ($i==9)?($w=4|$r=2):($w=7|$r=1);
    echo 'w= '.$w.' r= '.$r;//w= 7 r= 1
    
    
    $i=444;
    ($i==9)?($w=4|$r=2):($w=1|$r=1);
    echo 'w= '.$w.' r= '.$r;//w= 1 r= 1 
    

    谢谢。。。


    编辑:

    我做了更多的测试,发现这是正确的:

        ($i==9)?($w=4 AND $r=7):($w=7 AND $r=1);
    

    但是,我不确定这是否正确。我很好奇第一个例子里发生了什么。

    4 回复  |  直到 14 年前
        1
  •  8
  •   Mike    14 年前

    正如Chadwick所解释的,使用 AND OR 逻辑运算符将不会按您希望的方式工作:

    $i = 0; $w = 0; $r = 0;
    ($i==9) ? ($w=4 AND $r=7) : ($w=7 AND $r=1);
    echo "w = $w, r = $r\n";
    // w = 7, r = 1
    
    $i = 0; $w = 0; $r = 0;
    ($i==9) ? ($w=0 AND $r=7) : ($w=0 AND $r=1);
    echo "w = $w, r = $r\n";
    // w = 0, r = 0
    

    但是,如果确实希望在一条语句中进行多个赋值,可以使用 list 构造:

    $i = 0; $w = 0; $r = 0;
    ($i==9) ?
        (list($w, $r) = array(4, 7)) :
        (list($w, $r) = array(7, 1));
    echo "w = $w, r = $r\n";
    // w = 7, r = 1
    
    $i = 0; $w = 0; $r = 0;
    ($i==9) ?
        (list($w, $r) = array(0, 7)) :
        (list($w, $r) = array(0, 1));
    echo "w = $w, r = $r\n";
    // w = 0, r = 1
    
        2
  •  3
  •   Chadwick    14 年前

    这个 OR

    如果你换成 AND 状态(或 && 0 (即false),则不计算和的后半部分。这可能比第一个更难调试,因为第一个值可能很少为零。它可能永远不会,这将永远有效。。。直到有一天。。。

    三元运算符只是 if...else... 独立的 作业我强烈建议去标准如果…否则。。。更容易阅读。

        3
  •  3
  •   NikiC    14 年前

    我将尝试解释为什么您当前的代码会像它那样运行。 首先要知道: | | 具有比 = 因此先执行。

    那么,让我们看看第一个代码: $w=3|$r=2 . 根据运算符优先级,此代码可按以下方式编写: $w=(3|$r=2) $r 设置正确,然后 $w=3|2 已执行。 3 在双重系统中 11 2 10 .

      11
    | 10
    ====
      11
    

    所以结果是正确的。

    现在,让我们看看第二个代码:

    $w=4|$r=2 与相同 $w=(4|$r=2) . 如果设置正确 $w=4|2 已执行。 4 100 在双重系统中, 2 010 :

      100
    | 010
    =====
      110
    

    以及 110 在十进制中是 6 !

    所以,现在你知道错误的值是从那里来的,现在让我们找到一个解决方案:

    && 这里不鼓励,因为如果第一个值设置为 0 $w=1&&$r=2 与相同 $w=(1&&$r=2) $w 总是被分配 true false .

    一个可能的解决办法是使用 xor 接线员。此运算符要求两边都执行,并且具有完美的精度:

    $i == 9 ? ($w = 1 xor $r = 2) : ($w = 2 xor $r = 3);
    

        4
  •  0
  •   Sarfraz    14 年前

    缺少一个管道字符以形成 OR 条款:

    ($i==9)?($w=3|$r=2):($w=7|$r=1);
    

    ($i == 9) ? ($w = 3 || $r = 2) : ($w = 7 || $r = 1);
    

    是的,正如我们所见,你有不止一个变量 $w $r 在那里用过。