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以外,表达式的类型都被自动提升了。记住上面三点,防止条件表达式陷阱。
相关推荐
在C/C++编程中,问号冒号表达式(也称为条件运算符或三元运算符)是一种常用的语法结构,其格式为:`条件表达式 ? 表达式1 : 表达式2`。当条件表达式的结果为真(非零值)时,整个表达式的值为`表达式1`;反之,则为...
4. **高级特性详解**:深入探讨了更复杂的正则表达式特性,如回溯控制、条件匹配、命名捕获组等,并通过具体例子展示如何利用这些特性编写更高效、更灵活的正则表达式。 5. **解决常见问题**:针对性能不佳、误报、...
4. **高级特性**:如lookaround(前瞻后顾)、条件表达式、嵌套结构等,这些都是正则表达式进阶使用的必备知识,能实现更精细的匹配控制。 5. **正则表达式引擎的差异**:书中讨论了不同的正则表达式引擎(如Perl、...
6. **最佳实践**:可能还会分享编写高效、可读性强的表达式的建议,以及如何避免潜在的错误和陷阱。 通过深入学习这个IFIX示例,用户将能够更好地掌握如何在单一表达式中管理和展示多样化的状态,这对于提高IFIX...
5. 正则表达式的高级特性:讲解断言、前瞻和后顾等高级特性,这些特性可以控制模式的匹配条件而不消耗字符。 6. 性能优化和正则表达式的陷阱:分析正则表达式的性能问题和常见错误,提供解决方案和优化技巧。 7. ...
7. **最佳实践**:提供编写清晰、易读的问号表达式的建议,以及避免常见陷阱的方法。 视频文字.txt文件可能包含了教程的详细步骤和解释,帮助学习者更好地理解每一个概念。通过观看“java中的问号表达式视频教程...
for循环的基本语法包括初始化表达式、循环条件表达式和循环后表达式三个部分。下面将详细介绍for循环的语法、使用方法和注意事项。 1. for循环的语法 for循环的基本语法如下: ```c for (初始化表达式; 循环条件...
6. **高级用法**:包括零宽度断言(如前瞻断言和后顾断言)、条件表达式、环视(lookaround)等复杂技巧,这些高级特性使得正则表达式可以进行更精确的匹配。 7. **实战应用**:书中可能会提供大量的实例,如邮箱...
if语句的语法相对简单,可以包含一个条件表达式,如果条件表达式的结果为真(true),则执行大括号内的代码块,否则不执行。在Java中,条件表达式必须是一个布尔值(boolean),这意味着它可能是直接的布尔变量,...
3. 检查边界条件:确保正则表达式能有效排除无效的输入,减少不必要的回溯。 4. 利用预检查(lookahead/lookbehind):这些零宽度断言可以在不消耗字符的情况下进行验证,减少回溯的可能性。 5. 考虑使用DFA引擎:...
然而,值得注意的是,正则表达式的灵活性和强大功能往往伴随着复杂性和潜在的陷阱,特别是在处理异常情况或极端条件时。因此,在实际应用中,应根据具体需求和上下文仔细设计和测试正则表达式,以确保其准确性和效率...
",分别表示向前和向后查找但不消耗字符),以及条件表达式(允许根据之前的匹配结果选择不同的匹配路径)。 此外,书中还深入讨论了正则表达式的效率问题,包括如何优化正则表达式以提高匹配速度,以及如何避免...
《精通正则表达式》中还可能涵盖一些高级主题,如正则表达式的后向引用、条件语句、递归表达式等,这些都是解决复杂文本处理问题的强大工具。通过阅读本书,读者可以全面掌握正则表达式,提升自己的文本处理技能,并...
2. **高级特性**:如后向引用、非捕获组、条件表达式、嵌套和递归、预查(零宽断言)等,这些特性使正则表达式具备了处理复杂模式的能力。 3. **回溯原理**:解释了正则引擎如何通过回溯来处理匹配过程,理解这一点...
在《js/css hack》博文中,作者JasonGreen详细探讨了这些技术,分享了一些实用的技巧和陷阱,旨在帮助开发者解决跨浏览器兼容性问题。通过理解和运用这些注释表达式,开发者能更好地控制他们的代码,确保在各种环境...
10. **陷阱与误区**:学习正则表达式时,可能会遇到一些常见的错误和陷阱,如无限循环、不必要的复杂性等。文档通常会给出避免这些问题的建议。 总的来说,这份详尽的正则表达式帮助文档旨在帮助开发者熟练掌握这一...
- **回溯陷阱**: 当正则表达式存在贪婪匹配和不必要的分支时,可能引发大量回溯,影响性能。 7. **最佳实践** - **保持简洁**: 避免过度复杂的正则表达式,力求简洁明了。 - **测试与调试**: 使用在线正则...
9. 高级技巧:可能涉及正向前瞻断言、负向前瞻断言、环视条件等复杂正则表达式技术。 10. 实战应用:通过实例讲解如何在各种编程语言中(如JavaScript、Python、Java等)使用正则表达式,以及在文本编辑器和命令行...
通过阅读本书,读者可以学会如何构建更高效、更准确的正则表达式,避免常见陷阱,并提升解决问题的能力。 总而言之,《精通正则表达式》(第三版)是一本全面而深入的教程,无论你是初学者还是经验丰富的开发者,都...