我想看看是否可以用一个三元运算符设置多个变量。我有点谷歌了,但没有拿出任何东西。我开始测试一些想法,发现了一些接近 - 但也有一些奇怪的行为;关于发生了什么的任何想法?并且,是否可以在单个三元运算中设置多个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);
然而,我不确定这是否正确。我很好奇第一个例子中发生了什么。
答案 0 :(得分:7)
正如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
答案 1 :(得分:3)
OR
运算符正在缩短您在三元组表达式中所做的第二个作业。因此,如果第一个评估为非零,则不会进行第二次分配。
如果切换到AND
语句(或&&
),表达式中的第二个赋值仍然取决于第一个:如果第一个求值为0
(即为false),那么AND的后半部分没有被评估。调试可能比第一个更困难,因为第一个值可能很少为零。它可能永远不会,这将永远有效......直到那一天......
三元运算符只是if...else...
的简写,只有单个表达式而不是多个语句。如果您想要多个独立的分配,我强烈建议您使用标准if ... else ...更容易阅读。
答案 2 :(得分:3)
我将尝试解释为什么您当前的代码表现得像它的行为。
首先要知道的是:|
是按位运算符。第二件事要知道:|
的运算符优先级高于=
,因此首先执行。
那么,让我们来看看第一个代码:$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)
相同。 $r
设置正确,然后执行$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);
但是,你可以想象,这很难读,所以最好不要使用它......
答案 3 :(得分:0)
您缺少一个竖线字符来形成OR
子句:
($i==9)?($w=3|$r=2):($w=7|$r=1);
应该是:
($i == 9) ? ($w = 3 || $r = 2) : ($w = 7 || $r = 1);
是的,可以看出你在那里使用了多个变量$w
和$r
。