题目1:【中国东北著名软件公司D2009年3月笔试题】
int a=5;
("a="+((a<5)?10.9:9));
A. 编译错误
B. 10.9
C. 9
D. 以上答案都不对
也许和大多数人一样,刚开始想当然的以为a<5为false,那么结果就是9了,选C嘛!
仔细想想,这就是题目设置的陷阱。在表达式=(a<5)?10.9:9中有一个10.9,这是java就会根据运算符的精度进行自动类型的转换,由于前面是10.9,那么后面的9也就跟着变为9.0了!
题目2:【中国东北著名软件公司D2009年3月笔试题】
char x='x';
int i=10;
(false?i:x);
(false?100:x);
A. 120
B. 120 120
C. x 120
D. 以上答案都不对
答案为A
解析:(false?i:x)与上个题目1相同,x被提升为int类型,所以输出x的ASCII码
而对于第二行,由于100是一个常量表达式。若三目运算符中的两个表达式有一个是常量表达式,另一个是类型T(本题中为char)的表达式,且常量表达式可以被T表示,则输出结果是T类型。因此输出是字符
核心思想:
1.若三目运算符中的两个表达式有一个是常量表达式,另一个是类型T的表达式,且常量表达式可以被T表示,则输出结果是T类型。
2.如果都是常量表达式,用向上类型转换
进入习题模式:
(1)
char x='x';
int i=10;、
(false?10000:x);
系统输出:x
好的,如果修改一下呢
char x='x';
int i=10;、
(false?100000:x);
系统输出是怎样呢?120!
解析:【核心思想1】10000可以被本题的T类型表示,所以输出结果为T类型,输出x;但是换成100000就不行了,因为它超过了ASCII码范围。那么就是就输出x的ASCII码值
继续延伸
char x='x';
(true?100:x);
这个呢?
解析:同样适用【核心思想1】,true之后进入condition1.100可以被T类型表示,那么输入将是T类型(char 类型),100对应ASCII为d,那么输出d.
(2)
char x='x';
(true?x:10);
(true?x:10.0);
好的,第一行应该输出是x,这个没有问题。那么第二行呢?结果:120.0
解析:适用【核心思想1】,但是10.0不能被T类型,那么输出将不是T类型。120将升级为double类型变为120.0
(3)
(fasle?9:10.0);
(true?9:10.0);
结果:10.0 9.0
解析:适用【核心思想2】,第一行fasle的结果就是最高类型;第二行9将升级为double类型变为9.0