这是一段在抖音上看到的代码,还挺有趣的。(抖音:幽默的秃头程序员 2023-08-16)
请看下面这段代码,并给出你的答案
//JDK1.8
public class Test{
public static void main(string[] args){
char x='x';
byte i=0;
System.out.printLn(true?x:0);
System.out.printLn(false?i:x);
//你也可以猜猜下面这一行输出的内容是什么
//System.out.printLn(false?x:0);
}
}
很简单地一个问题,当然答案没有那么简单、
第一眼的答案可是 控制台输出
x
x
并不是的,控制台输出的是
x
120
被注解的内容输出 null,为什么会这样,最下面的结论有解释。
我们来探讨一下为什么会出现这种情况,第一个三目运算符的结果是变量x的值,也就是char字符x,输出也没错,但第二个三目输出变量x时,并没有直接输出字符x,而是x的Ascll码值。
这是为什么,也许你会说这是表达式类型提升,确实,在表达式中,当同时出现类型不同的变量时,会发生类型提升,也就是说第二个三目将变量x的类型由char提升到了int。这可以说通,那么,为什么第一个三目没有发生类型提升呢。
在程序中直接出现的数值魔法值,默认类型为int(可能有误)。
请看以下内容来佐证这个结论
//定义一个short类型的变量
short it=5;
//表达式中的it将被提升到int类型
//将int类型赋给short将发生错误
it=it-2;
//下述操作可避免错误
//it-=2;
这是我的博文 记录《疯狂Java讲义精粹》划线内容及理解(1-2章)中 2.4章节的一个例子。
由于it本身就是 short,因此只能是魔法值2的类型为int,因此出发了自动类型升级,导致出现错误。
现实与理论出现了偏差,于是我们重新运行本章节最上面的例子,但我们将数值魔法值与byte,short,int,char,普通字符串,引用等类型都试一遍。
我直接来说结论吧。
在三目运算符中,当表达式二,三分别出现 char 与 数值魔法值时,会将魔法值提升到char类型,这时输出的魔法值表现为对应的Ascll码表字符,而如果输出 char 值,表现为原本的值。
当三目表达式的,表达式二,三,分别为 char 与 基本数值类型时,char将被提升到 int,输出char时将表现为 数值,输出 数值时为本来的值。
总结一下
1.数值魔法值与char在同一个三目表达式,魔法值输出表现为 Ascll码对应的字符(第一个程序中的被注解掉的那行代码可以佐证该观点)
2.数值魔法值与基本数值类型在同一个三目表达式,魔法值类型提升为int,输出表现为本来的值。
3.数值魔法值与引用类型在同一个三目表达式,表现为int,输出值为本来的值
再说一下原博主的解释抖音:幽默的秃头程序员 2023-08-18)
博主直接查看了官方文档,结论是;
在三目中,当第二,第三操作数类型不同时:
第三操作数是否在第二操作数的范围内,如是,返回第二操作数的类型,如否,将两个操作数都提升到int。
其实到这里,虽然解释有些不同,但都能解释上述代码的输出结果。
其实还有个问题,程序中出现的数值魔法值的类型是什么