1

如果你在 php 中

echo (('a'=='a')?'A':('a'=='b')?'B':'C');

结果将是:

B

完全是垃圾。根据php docs (example#3)这是因为

三元表达式从左到右计算。

这并没有真正为我解释:从左到右评估,('a'=='a')所以结果是'A',不!?真的不知道 php 是如何从中得到'B'的。这种语句适用于很多很多语言,但不是 php。有谁了解这里的 php 逻辑,以及如何最好地在 php 中解决这个问题?

4

2 回答 2

1

评估左侧的整个表达式。这些是相同的:

echo( ('a' == 'a') ? 'A' : ('a' == 'b')  ? 'B' : 'C');
echo((('a' == 'a') ? 'A' : ('a' == 'b')) ? 'B' : 'C');

下面的表达式计算为A

('a' == 'a') ? 'A' : ('a'=='b');

而这个快递评估为B

('A' ? 'B' : 'C');

如果移动括号,表达式将按照您的预期进行计算:

echo(('a' == 'a') ? 'A' : (('a' == 'b') ? 'B' : 'C'));
于 2013-10-15T23:21:56.627 回答
0

实验上,

echo (('a'=='a')?'A':(('a'=='b')?'B':'C'))

输出

A

看起来 php 实现已经搞砸了运算符优先级,给出:了比 更高的优先级?,所以没有括号,

('a'=='a')?'A':('a'=='b')

被组合在一起,所以表达式:

('a'=='a')?'A':('a'=='b')?'B':'C'

评估为

('A'?'B':'C');

这导致'B''A'不是0FALSE,所以是TRUE)。

于 2013-10-15T23:32:43.673 回答