繁体   English   中英

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

[英]Is it possible to set multiple variables with one ternary operator?

我想看看是否可以用一个三元运算符设置多个变量。 我有点谷歌了,但没有拿出任何东西。 我开始测试一些想法,发现了一些接近 - 但也有一些奇怪的行为; 关于发生了什么的任何想法? 并且,是否可以在单个三元运算中设置多个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);

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

正如Chadwick所解释的那样,使用ANDOR逻辑运算符将无法按照您希望的方式运行:

$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

OR运算符正在快速执行您在三元组表达式中所做的第二个赋值。 因此,如果第一个求值为非零,则不会进行第二个赋值。

如果切换到AND语句(或&& ),表达式中的第二个赋值仍依赖于第一个赋值:如果第一个求值为0 (即false),则不计算AND的后半部分。 调试可能比第一个更困难,因为第一个值可能很少为零。 它可能永远不会,这将永远有效......直到有一天......

三元运算符只是if...else...简写,只有单个表达式而不是多个语句。 如果你想要多个独立作业,我强烈推荐使用标准if ... else ...更容易阅读。

我将尝试解释为什么您当前的代码表现得像它的行为。 首先要知道: | 是按位运算符。 第二件事要知道: | 具有比=更高的运算符优先级,因此首先执行。

那么,让我们来看看第一个代码: $w=3|$r=2 根据运算符优先级,此代码可以这样编写: $w=(3|$r=2) 所以$r得到正确设置然后执行$w=3|2 3在双系统11210

  11
| 10
====
  11

所以结果是正确的。

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

$w=4|$r=2$w=(4|$r=2) $r设置正确,然后执行$w=4|2 4100在双系统, 2010

  100
| 010
=====
  110

十进制中的1106

那么,现在您知道错误的值来自,现在让我们找到一个解决方案:

不鼓励使用&& ,因为如果第一个值设置为0则根本不会设置第二个值。 此外,它有错误的运算符优先级: $w=1&&$r=2$w=(1&&$r=2) 所以$w总是被赋值为truefalse

一种可能的解决方案是使用xor运算符。 此运算符需要执行双方并且它具有完美的优先级:

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

但是,你可以想象,这很难读,所以最好不要使用它......

您缺少一个管道字符来形成OR子句:

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

它应该是:

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

是的,可以看出你在那里使用了多个变量$w$r

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM