JAVA开发陷阱第三篇(三元操作符类型务必一致)

三元操作符是if---else的简化写法,在项目中使用到它的地方很多,也非常好用。但是好用又简单的东西并不表示就可以随便使用,下面我们来看看一下的这段代码.

public class Client{
     public static void mian(String[] args){
int i=80;
String s=String.valueOf(i<100?90:100);
String s1=String.valueOf(i<100?90:100.0);
System.out.println("两者是否相等:"s.equals(s1));
   
}
}

分析一下上面的这段程序,i是80 那么当然是小于100啦,两者的返回值都是90.再转成String类型,
他们的只应该也是相等的,毋庸置疑吧。恩,分析的虽然很有道理,但是很遗憾的告诉你,结果是错误的。仔细观察,变量s中三元操作符的第二个操作数是100,而变量s2的三元运算符的第二个操作数确实100.0,难道没有影响吗?不可能有影响,三元操作符的条件都为真了,只返回一个值,与第二个值有半毛钱的关系吗?貌似讲得通。

但是果真是这样的吗?通过验证我们知道结果是false。可是为什么?

问题就出在100和100.0身上,在变量s中三元操作符中的第一个操作数(90)和第二个操作数100都是int类型,类型相同返回的结果也就是90了。而变量s1的情况却有一点不相同了,第一个操作数是90而第二个操作数确实100.0,而这个数却是个浮点数,也就是说两个操作的类型不一致,可三元操作符必须必须返回一个数据,而且类型要确定,不可能条件为真实返回int类型,为假时就返回float类型,编译器肯定是不允许这样的,所以会进行类型转换,也就是说三元运算符的返回值为90.0,可是为什么不是float转换为int类型呢?这就涉及三元操作类型符的转换规则,

若两个操作数不可转换,则不作转换,返回值为Object。

若两个操作数是明确类型的表达式,(比如变量),则按照正常的二进制进行转换,int类型转换为long类型,long类型转换为float类型。。

若两个操作数中有一个是S。另外一个是表达式。且其类型是T。那么,若数字S在T的范围内,则转换为T类型。反之则转换为S。

如果两个操作数是都是直接量数字(Literal),则返回值类型为范围较大者,知道这个原因就好办了,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BruceCheng夏夏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值