3

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

4 回答 4

8

正如查德威克所解释的,使用ANDorOR逻辑运算符不会按照您希望的方式工作:

$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
于 2010-07-15T21:15:39.197 回答
3

OR运算符正在简化您在三元表达式中所做的第二个分配。因此,如果第一个评估为非零,则不会进行第二个分配。

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

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

于 2010-07-15T20:59:07.797 回答
3

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

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

  11
| 10
====
  11

所以结果是正确的。

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

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

  100
| 010
=====
  110

110在十进制中是6

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

不鼓励在此处使用&&,因为如果将第一个值设置为0第二个值,则根本不会设置。此外,它有错误的运算符优先级:与 .$w=1&&$r=2相同$w=(1&&$r=2)。所以$w总是会被分配trueor false

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

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

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

于 2010-07-15T21:27:58.970 回答
0

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

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

它应该是:

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

是的,可以看出你有不止一个变量$w$r在那里使用。

于 2010-07-15T20:59:11.353 回答