Object o = true ? new Integer(1) : new Double(2.0); System.out.println(o);
上面代码会打印什么?相信很多人都会觉得打印:1。
认为它等同于:
Object o2; if (true) o2 = new Integer(1); else o2 = new Double(2.0); System.out.println(o2);
做测试发现第一段代码打印:1.0。第二段代码打印:1。
查阅条件运算符规则,总结核心三点:
1、如果第2个和第三个有相同的类型,那么它就是条件表达式的类型。
2、如果一个操作数的类型是T,T为byte、short、char,而另一个操作数是一个int类型的 常量 表达式时,如果条件表达式的类型为T时,结果为类型T。
3、否则将对操作数类型运用2进制数字提升,而表达式的类型就是第二个和第三个操作数被提升后的类型。
原来第一段代码的类型被提升为Double类型了,继续做更多的测试:
Object o = true ? new Byte("1") : new Short("2"); Object o1 = true ? new Short("1") : new Integer("2"); Object o2 = true ? new Integer(1) : new Double(2.0); Object o3 = true ? new Integer(1) : new Float(2.0); Object o4 = true ? new Double(2.0) : new Float(2.0); Object o5 = true ? new Byte("1") : 2; Object o6 = true ? 1 : new Float(2.0); Object o7 = true ? 1 : new Short("2"); Object o8 = true ? 1 : 2.0; byte x = 1; Object o9 = true ? x : 2; Object o10 = true ? x : new Integer("2"); System.out.println("o=" + o + " 类型:" + o.getClass()); System.out.println("o1=" + o1 + " 类型:" + o1.getClass()); System.out.println("o2=" + o2 + " 类型:" + o2.getClass()); System.out.println("o3=" + o3 + " 类型:" + o3.getClass()); System.out.println("o4=" + o4 + " 类型:" + o4.getClass()); System.out.println("o5=" + o5 + " 类型:" + o5.getClass()); System.out.println("o6=" + o6 + " 类型:" + o6.getClass()); System.out.println("o7=" + o7 + " 类型:" + o7.getClass()); System.out.println("o8=" + o8 + " 类型:" + o8.getClass()); System.out.println("o9=" + o9 + " 类型:" + o9.getClass()); System.out.println("o10=" + o10 + " 类型:" + o10.getClass());
打印:
o=1 类型:class java.lang.Short
o1=1 类型:class java.lang.Integer
o2=1.0 类型:class java.lang.Double
o3=1.0 类型:class java.lang.Float
o4=2.0 类型:class java.lang.Double
o5=1 类型:class java.lang.Byte
o6=1.0 类型:class java.lang.Float
o7=1 类型:class java.lang.Short
o8=1.0 类型:class java.lang.Double
o9=1 类型:class java.lang.Byte
o10=1 类型:class java.lang.Integer
在条件表达式两个类型不同的情况下,除了byte、short、char以外,表达式的类型都被自动提升了。记住上面三点,防止条件表达式陷阱。
相关推荐
本书旨在教会读者很多新的技巧以及如何避免语言特定的陷阱,读者可以通过本书提供的实例解决方案库来解决实践中的复杂问题。 作者简介 Jan Goyvaerts领导着Just Great Software公司,他在这个公司设计和开发了一些...
本书旨在教会读者很多新的技巧以及如何避免语言特定的陷阱,读者可以通过本书提供的实例解决方案库来解决实践中的复杂问题。 作者简介 Jan Goyvaerts领导着Just Great Software公司,他在这个公司设计和开发了一些...
正则表达式是一类用于匹配文本的表达方式,常用于grep命令中表达检索条件。其实就是相当于你在用百度搜索时规定一些高级要求,例如你想找百度一个叫做詹姆斯的人的照片,你会发现出来一大堆骑士队的詹姆斯,这时候你...
第5课 表达式中的陷阱 5.1 关于字符串的陷阱 5.1.1 JVM对字符串的处理 5.1.2 不可变的字符串 5.1.3 字符串比较 5.2 表达式类型的陷阱 5.2.1 表达式类型的自动提升 5.2.2 复合赋值运算符的陷阱 5.3 输入法...
目录 更新记录 卷首语 Ruby的启动 命令行选项 关于解释器行 环境变量 Ruby 语言样式 对象 类 执行 结束时的相关处理 线程 安全模型 正则表达式 ...操作符表达式 ...Ruby的陷阱 ...发布条件
–if语句:使用布尔表达式或布尔值作为分支条件来进行分支控制。 –switch语句:用于对多个整型值进行匹配,从而实现分支控制。 if条件语句 •if条件语句的3种形式: • ▲ if (logic expression) { ...
Go 语言编程 + Go 学习笔记, 第 部分 语 第 1 章 类型 1.1 变量 ...2. 条件编译 3. 跨平台编译 4. 预处理 B. 调试 1. GDB 2. Data Race C. 测试 1. Test 2. Benchmark 3. Example 4. Cover 5. PProf
9.2 指针陷阱 83 9.3 cgo 86 9.4 Reflect 94 第⼆部分 源码 109 1. Memory Allocator 110 1.1 初始化 112 1.2 分配流程 117 5 Go 学习笔记, 第 4 版 1.3 释放流程 131 1.4 其他 135 2. Garbage Collector 140 2.1 ...
9.2 指针陷阱 83 9.3 cgo 86 9.4 Reflect 94 第⼆二部分 源码 109 1. Memory Allocator 110 1.1 初始化 112 1.2 分配流程 117 Go 学习笔记, 第 4 版 5 1.3 释放流程 131 1.4 其他 135 2. Garbage Collector 140 2.1 ...
2.1.1 C语言中的无条件跳转 2.1.2 使用goto语句进行出错处理 2.1.3 出错处理的一般模型 2.2 C语言中的分支结构 2.2.1 分支结构的翻译 2.2.2 使用goto语句实现分支结构 2.3 短路计算 2.3.1 短路计算 2.3.2 &&运算的...
23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与...
6.15 微妙的陷阱:返回对Private数据成员的引用 6.16 通过默认的成员复制进行赋值 6.17 软件复用性 6.18 有关对象的思考:编写电梯模拟程序的类 小结 术语 自测练习 自测练习答案 练习 第7章 类与数据抽象(二) 7...
23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数...
23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与...
23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与...
23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与...
23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与...
23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与...
23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与...