`
毛驴追飞机
  • 浏览: 16362 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

条件表达式陷阱

    博客分类:
  • java
阅读更多

 

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公司,他在这个公司设计和开发了一些...

    正则表达式经典实例.pdf

    本书旨在教会读者很多新的技巧以及如何避免语言特定的陷阱,读者可以通过本书提供的实例解决方案库来解决实践中的复杂问题。 作者简介 Jan Goyvaerts领导着Just Great Software公司,他在这个公司设计和开发了一些...

    bash 中用于grep的正则表达式

    正则表达式是一类用于匹配文本的表达方式,常用于grep命令中表达检索条件。其实就是相当于你在用百度搜索时规定一些高级要求,例如你想找百度一个叫做詹姆斯的人的照片,你会发现出来一大堆骑士队的詹姆斯,这时候你...

    突破程序员基本功的16课.part2

    第5课 表达式中的陷阱 5.1 关于字符串的陷阱 5.1.1 JVM对字符串的处理 5.1.2 不可变的字符串 5.1.3 字符串比较 5.2 表达式类型的陷阱 5.2.1 表达式类型的自动提升 5.2.2 复合赋值运算符的陷阱 5.3 输入法...

    ruby教程.rar

    目录 更新记录 卷首语 Ruby的启动 命令行选项 关于解释器行 环境变量 Ruby 语言样式 对象 类 执行 结束时的相关处理 线程 安全模型 正则表达式 ...操作符表达式 ...Ruby的陷阱 ...发布条件

    【03-流程控制与数组】

    –if语句:使用布尔表达式或布尔值作为分支条件来进行分支控制。 –switch语句:用于对多个整型值进行匹配,从而实现分支控制。 if条件语句 •if条件语句的3种形式: • ▲ if (logic expression) { ...

    Go 语言编程 + Go 学习笔记

    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

    Go学习笔记(第四版).zip

    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 ...

    go学习笔记

    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 ...

    Linux C程序设计大全

    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 &&运算的...

    免费下载:C语言难点分析整理.doc

    23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与...

    C++大学教程,一本适合初学者的入门教材(part1)

    6.15 微妙的陷阱:返回对Private数据成员的引用 6.16 通过默认的成员复制进行赋值 6.17 软件复用性 6.18 有关对象的思考:编写电梯模拟程序的类 小结 术语 自测练习 自测练习答案 练习 第7章 类与数据抽象(二) 7...

    C语言难点分析整理.doc

    23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数...

    c语言难点分析整理,C语言

    23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与...

    高级C语言 C 语言编程要点

    23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与...

    高级进阶c语言教程..doc

    23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与...

    史上最强的C语言资料

    23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与...

    高级C语言详解

    23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与...

    C语言难点分析整理

    23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与...

Global site tag (gtag.js) - Google Analytics