三目运算符与魔法值

这是一段在抖音上看到的代码,还挺有趣的。(抖音:幽默的秃头程序员 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。

其实到这里,虽然解释有些不同,但都能解释上述代码的输出结果。

其实还有个问题,程序中出现的数值魔法值的类型是什么

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值