如果你在 php 中
echo (('a'=='a')?'A':('a'=='b')?'B':'C');
结果将是:
B
这完全是垃圾。根据php docs (example#3)这是因为
三元表达式从左到右计算。
这并没有真正为我解释:从左到右评估,('a'=='a')
所以结果是'A'
,不!?真的不知道 php 是如何从中得到'B'
的。这种语句适用于很多很多语言,但不是 php。有谁了解这里的 php 逻辑,以及如何最好地在 php 中解决这个问题?
如果你在 php 中
echo (('a'=='a')?'A':('a'=='b')?'B':'C');
结果将是:
B
这完全是垃圾。根据php docs (example#3)这是因为
三元表达式从左到右计算。
这并没有真正为我解释:从左到右评估,('a'=='a')
所以结果是'A'
,不!?真的不知道 php 是如何从中得到'B'
的。这种语句适用于很多很多语言,但不是 php。有谁了解这里的 php 逻辑,以及如何最好地在 php 中解决这个问题?
评估左侧的整个表达式。这些是相同的:
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'));
实验上,
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'
不是0
或FALSE
,所以是TRUE
)。