三元表达式错误解惑

时间:2023-02-25 22:50:15

三元表达式是要么没人理它,要么它就是焦点,没人理它时是因为它可以被if代替,例如

 $a="default value";
 $a=$exp?"real value":"default value";

总有时会存在上面这种情况,其实用if更合理

if($exp) $a="real value";

说它是焦点是因为

1:有人喜欢精减代码,把很多的if...else精减成三表达式

$v=85;
echo $v<60?"不及格":$v==60?"过关":$v>80?"优秀":"合格";

php的官方手册也不建议上面这种写法,语义上混乱不说,修正或以后改的时候也容易出错,代码易读和易维护是重点


2.面试的时候总能看到它的变体试题,主要是看你对基础了解到什么程度和看问题的角度,因为三元表达式的错误能反映不至一个点上的知识

下面的示例来自手册

echo true?'true':false?'t':'f';

2.1.运算符的优先级,你期望它是这样执行的

echo true?'true':(false?'t':'f');

其实它是这样执行的

echo (true?'true':false)?'t':'f';

2.2.类型转换,上面括号中的表达式值成了

(字符串)?真:假

php以下在转换成boolean类型时为:false

1.空字符串,以及字符串 "0" 

2.false本身


3.来自<<java解惑>>中的关于三元表达试的迷题

public class DosEquis{
public static void main(String[] args){
    char x = 'X';
    int i = 0;
    System.out.println(true ? x : 0);
    System.out.println(false ? i : x);
}
}

3.1,println方法的重载

3.2,类型的转换,第二个println中,char进行了类型提升,升为int,

      再这注意char,int之间的符号区别,前者无符号,后者有符号

      最后java的数字基本类型都是二进制的

3.3.字面常量和变量对三元表达式结果的影响


最后:

不论是面试题还是工作中的程序bug,它们往往折射出的问题不是一点或二点能总结的。更多的需要程序员自身去领悟语言的精粹,而不是去抱怨这种语言有多烂别的语言有多人性和完美