2010-07-15 145 views
2

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

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

回答

7

由于查德威克解释,使用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 
3

OR运算符正在缩短您在三元表达式中进行的第二次分配。所以如果第一项评估为非零,那么第二项任务就没有做出。

如果切换到一个AND statment(或&&)在表达所述第二分配仍然依赖于所述第一:如果所述第一计算结果为0(即假),则的第二半部分和不进行评价。这可能比第一个调试更困难,因为第一个值很可能是零。它可能永远不会,并且这将始终有效......直到那一天......

三元运算符只是if...else...的简写形式而不是多个语句。如果你想多个,独立作业我强烈建议去与标准如果...其他...更容易阅读四周。

0

你缺少一个竖线,形成一个OR条款:

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

它应该是:

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

而且是可以看出你有一个以上的变量$w$r使用那里。

3

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

因此,让我们来看看第一个代码:$w=3|$r=2。根据运营商的优先级,此代码可以这样写:$w=(3|$r=2)。因此$r get的设置正确,然后执行$w=3|2。双系统中的311210

11 
| 10 
==== 
    11 

所以结果是正确的。

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

$w=4|$r=2是一样$w=(4|$r=2)$r设置正确,则执行$w=4|24100在双系统,2010

100 
| 010 
===== 
    110 

而且110在十进制系统为6

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

使用&&这里气馁,因为如果第一个值设置为0第二不会在所有设置。此外,它的运算符优先级错误:$w=1&&$r=2$w=(1&&$r=2)相同。所以$w总是会被分配truefalse

一种可能的解决方案是使用xor运算符。此操作需要将执行双方,并具有完善的precendance:

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

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

+0

+1感谢优秀的解释。我读到,单管是一个按位运算符,但不知道它做了什么。有趣的东西。再次感谢! – stormdrain 2010-07-15 21:37:02

+0

+1可以很好地解释问题。 – Mike 2010-07-15 21:52:40

相关问题