背景:
重新翻看PHP的手册,看看基础的东西,看到运算符的优先级问题的时候,碰到了这样的一串代码:
$a = 2;
echo (
$a == 1 ? ‘one‘ :
$a == 2 ? ‘two‘ :
$a == 3 ? ‘three‘ :
$a == 4 ? ‘four‘ : ‘other‘);
echo "\n";
// 输出结果为:four
一时之间想的不是很明白,写了相类似的Java代码
public class Test {
public static void main() {
int a = 2;
System.out.print( a == 1 ? ‘我‘ : a == 2 ? ‘你‘ : ‘它‘);
}
}
// 输出结果为:‘你‘;
花了一段时间弄明白了,但是不知道如何用语言清晰的表达出来,特此记录了一下!(如有错误,还请指正学习~)
解决:
先来看,如果用括号()忽略优先级问题
echo (
$a == 1 ? ‘one‘ :
($a == 2 ? ‘two‘ :
($a == 3 ? ‘three‘ :
($a == 4 ? ‘four‘ : ‘other‘)))
);
// 加了()之后,在PHP中等同于
if ($a == 4) {
echo ‘four‘;
}else if ($a == 3) {
echo ‘three‘;
}else if ($a == 2) {
echo ‘two‘;
}else if ($a == 1) {
echo ‘one‘;
}else{
echo ‘other‘;
}
// 输出都是 two
在来看,如果不使用()括号
Java.code
public calss Test {
public static void main(String[] args) {
int a = 2;
System.out.println( a == 2 ? ‘我‘ : true ? ‘你‘ : ‘它‘);
}
}
// ==>以上结果输出‘我‘;这个等同于:
if (a == 2) {
System.out.println(‘我‘);
}else {
if( true ){
System.out.println(‘你‘);
}esle {
System.out.println(‘它‘);
}
}
// ==>从此可以看出,在Java的三元运算符中 ? 是比 : 要优先的
php.code
$a = 2;
echo $a == 2 ? ‘我‘ : $a==1 ? ‘你‘ : ‘它‘;
// ==>以上输出的结果是:‘你‘;等同于:
if ($a == 2 ? TURE: FALSE){
echo ‘你‘;
}else {
echo ‘它‘;
}
从以上的结果,分析得出初步的结论(是否真的正确,不知道):
1.从代码转换为分支结构来看:
Java中解析扫描是从左到右的,而在PHP中扫描是从右到左的!即,在Java中
System.out.println( a == 2 ? ‘我‘ : true ? ‘你‘ : ‘它‘);和System.out.println( (a == 2 ? ‘我‘ : (true ? ‘你‘ : ‘它‘));等效!
而在PHP中,则不同:
echo $a == 2 ? ‘我‘ : $a==1 ? ‘你‘ : ‘它‘;
和
echo ($a == 2 ? ‘我‘ : $a==1 )? ‘你‘ : ‘它‘;
是等效的!
和
echo $a == 2 ? ‘我‘ : ($a==1 ? ‘你‘ : ‘它‘);是不等效的!
2.对于最后输出的结果,可以看出:
Java是属于多分支,所以有多个(3个:‘我‘ ‘你‘ ‘它‘)结果可以输出;
PHP最终解释成的只是双分支结果,结果只有2个(‘你‘ ‘它‘)可以输出
小结:
有挺久没碰过Java的代码了,还有就是不太知道表述的不知道是不是正确的!希望多多指正~
原文:http://www.cnblogs.com/lms520/p/4986445.html