$i = 2;
$result = ($i == 2) ? "Two" : ($i == 1) ? "One" : "Other";
echo $result; // outputs: One
虽然C#输出中的代码相同:两个
int i=2;
String result = (i == 2) ? "Two" : (i == 1) ? "One" : "Other" ;
Console.Write( result ); // outputs: Two
答案 0 :(得分:5)
评估三元运算符 LEFT-TO-RIGHT 。
($i == 2) ? "Two" : ($i == 1) ? "One" : "Other"
"Two" ? "One" : "Other" // first part evaluated to "Two"
"One" // non-empty strings evaluate to true
因此,您应该在输出中获得One
,而不是Other
。这有点棘手。
来自manual:
的明智话语建议您避免“堆叠”三元表达式。 PHP在单个语句中使用多个三元运算符时的行为是不明显的。
答案 1 :(得分:2)
@light已经提供了解释,但为了获得您想要的结果,您需要额外的大括号:
$i = 3;
$result = ($i == 2) ? "Two" : (($i == 1) ? "One" : "Other");
echo $result, PHP_EOL;
$i = 2;
$result = ($i == 2) ? "Two" : (($i == 1) ? "One" : "Other");
echo $result, PHP_EOL;
$i = 1;
$result = ($i == 2) ? "Two" : (($i == 1) ? "One" : "Other");
echo $result, PHP_EOL;
答案 2 :(得分:0)
这是因为C#是强类型的,并且需要一个布尔值作为三元运算符的第一个参数,而PHP是松散类型的,基本上每个值都可以转换为它的布尔等效值。此外,三元运算符从左到右进行评估。这是什么意思?
在C#中,我们需要在运算符的最左侧使用布尔值,所以这个表达式为:
String result = (i == 2) ? "Two" : (i == 1) ? "One" : "Other" ;
将按此顺序进行评估:
String result = (i == 2) ? "Two" : ((i == 1) ? "One" : "Other");
i==2
等于true
,因此"Two"
将被指定为最终结果。在PHP中它看起来有点不同。我们可以解释这个表达式:
$result = ($i == 2) ? "Two" : ($i == 1) ? "One" : "Other";
像这样
$result = (($i == 2) ? "Two" : ($i == 1)) ? "One" : "Other";
$i
等于2,因此值"Two"
将是第一个表达式的结果。 PHP中的非空字符串值等于true,因此" One"将是最终结果。