java填坑:三元操作符的类型不一致导致的问题
2017-08-10 17:47
225 查看
三元操作符是if-else的简化写法,我们在项目经常能用到他,但是有时候也容易出现问题,我们先看看下面这段代码:
分析一下这段代码:i是80,那它当然小于100,两者的返回值肯定都是90,再转成 String类型,其值也绝对相等,毋庸置疑的。恩,分析得有点道理,但是变量str1中三元操作表达式中的第二个操作数是100,而str2的第二个操作数是100.0,难道没有影响吗?不可能有影响吧,三元操作符的条件都为真了,只返回第一个值嘛,与第二个值有一毛钱的关系吗?貌似有道理。
果真如此吗?我们通过结果来验证一下,运行结果是:“两者是否相等:false”,什么? 不相等,Why?
问题就出在100和100.0这两个数字上,在变量str1中,三元操作符中的第一个操作数 (90)和第二个操作数(100)都是int类型,类型相同,返回的结果也就是int类型的90, 而变str2的情况就有点不同了,第一个操作数是90(int类型),第二个操作数却是100.0(float类型),两个操作数的类型不一致。可三元操作符必须要返回一个数据。而且类型要确定,不可能条件为真时返回int类型,条件为假时返回float类型,编译器是不允许如此的,所以它就会进行类型转换了,int型转换为浮点数90.0,导致最终返回值是浮点数90.0。那这当然与整型的90不相等了。
那么,为什么是整型转为浮点,而不是浮点转为整型呢,这就涉及三元操作符类型的转换规則:
若两个操作数不可转换,则不做转换,返回值为Object类型
若两个操作数是明确类型的表达式(比如变量),則按照正常的二进制数字来转换,int 类型转换为long类型,long类型转换为float类型等
若两个操作数中有一个是数字S,另外一个是表达式,且其类型为T,那么,若数字S在T的范围内,則转换为T类型;若S超出了T类型的范围,则T转换为S类
若两个操作数都是直接量数字(Literal) 则返回值类型为范围较大者。
int i = 80; String str1 = String.valueOf(i < 100 ? 90 : 100); String str2 = String.valueOf(i < 100 ? 90 : 100.0); System.out.println("俩者相等:" + str1.equals(str2));
分析一下这段代码:i是80,那它当然小于100,两者的返回值肯定都是90,再转成 String类型,其值也绝对相等,毋庸置疑的。恩,分析得有点道理,但是变量str1中三元操作表达式中的第二个操作数是100,而str2的第二个操作数是100.0,难道没有影响吗?不可能有影响吧,三元操作符的条件都为真了,只返回第一个值嘛,与第二个值有一毛钱的关系吗?貌似有道理。
果真如此吗?我们通过结果来验证一下,运行结果是:“两者是否相等:false”,什么? 不相等,Why?
问题就出在100和100.0这两个数字上,在变量str1中,三元操作符中的第一个操作数 (90)和第二个操作数(100)都是int类型,类型相同,返回的结果也就是int类型的90, 而变str2的情况就有点不同了,第一个操作数是90(int类型),第二个操作数却是100.0(float类型),两个操作数的类型不一致。可三元操作符必须要返回一个数据。而且类型要确定,不可能条件为真时返回int类型,条件为假时返回float类型,编译器是不允许如此的,所以它就会进行类型转换了,int型转换为浮点数90.0,导致最终返回值是浮点数90.0。那这当然与整型的90不相等了。
那么,为什么是整型转为浮点,而不是浮点转为整型呢,这就涉及三元操作符类型的转换规則:
若两个操作数不可转换,则不做转换,返回值为Object类型
若两个操作数是明确类型的表达式(比如变量),則按照正常的二进制数字来转换,int 类型转换为long类型,long类型转换为float类型等
若两个操作数中有一个是数字S,另外一个是表达式,且其类型为T,那么,若数字S在T的范围内,則转换为T类型;若S超出了T类型的范围,则T转换为S类
若两个操作数都是直接量数字(Literal) 则返回值类型为范围较大者。
相关文章推荐
- JAVA开发陷阱第三篇(三元操作符类型务必一致)
- [改善Java代码]三元操作符的类型务必一致
- MySQL从库的列类型不一致导致的复制异常问题
- 读书总结---三元操作符类型保持一致
- 建议3:三元操作符的类型务必一致
- java和scala中集合之contains方法易忽略类型不一致导致错误
- java三元表达式不同类型值的问题
- Java 条件表达式结果类型不一致问题
- Java三元操作符注意后面两个操作符的类型
- 在代码层面上解决由于Java用有符号数值类型映射MySQL无符号数值类型而导致的数值溢出问题
- java和mysql定义的字段类型不一致,前端取值问题
- 三元运算符 比较三个数大小 三元操作符的类型务必一致
- 解决项目中由于前端页面数据类型跟数据库类型不一致,导致获取数据为空引起问题
- 三元操作符的类型务必一致
- Java--因为char类型无法强制转换负数导致IO读取文件无法停止问题
- 提高你的Java代码质量吧:三元操作符的类型陷阱
- 三元操作符的类型务必一致
- Java 日期时间类型的几个问题总结[转]
- 头文件和Dll不一致导致的问题
- Java中String类型的参数传递问题的解析收藏--转载