这个谜题将测试你对条件操作符的掌握程度,这个操作符有一个更广为人知的名字:问号冒号操作符。下面的程序将会打印出什么呢?
public class DosEquis{
public static void main(String[] args){
char x = 'X';
int i = 0;
System.out.println(true ? x : 0);
System.out.println(false ? i : x);
}
}
这个程序由两个变量声明和两个print语句构成。第一个print语句计算条件表达式(true ? x : 0)并打印出结果,这个结果是char类型变量x的值’X’。而第二个print语句计算表达式(false ? i : x)并打印出结果,这个结果还是依旧是’X’的x,因此这个程序应该打印XX。然而,如果你运行该程序,你就会发现它打印出来的是X88。这种行为看起来挺怪的。第一个print语句打印的是X,而第二个打印的却是88。它们的不同行为说明了什么呢?
答案就在规范有关条件表达式部分的一个阴暗的角落里。请注意在这两个表达式中,每一个表达式的第二个和第三个操作数的类型都不相同:x是char类型的,而0和i都是int类型的。就像在谜题5的解答中提到的,混合类型的计算会引起混乱,而这一点比在条件表达式中比在其它任何地方都表现得更明显。你可能考虑过,这个程序中两个条件表达式的结果类型是相同的,就像它们的操作数类型是相同的一样,尽管操作数的顺序颠倒了一下,但是实际情况并非如此。
确定条件表达式结果类型的规则过于冗长和复杂,很难完全记住它们,但是其核心就是一下三点:
如果第二个和第三个操作数具有相同的类型,那么它就是条件表达式的类型。换句话说,你可以通过绕过混合类型的计算来避免大麻烦。
如果一个操作数的类型是T,T表示byte、short或char,而另一个操作数是一个int类型的常量表达式,它的值是可以用类型T表示的,那么条件表达式的类型就是T。
否则,将对操作数类型运用二进制数字提升,而条件表达式的类型就是第二个和第三个操作数被提升之后的类型。
2、3两点对本谜题是关键。在程序的两个条件表达式中,一个操作数的类型是char,另一个的类型是int。在两个表达式中,int操作数都是0,它可以被表示成一个char。然而,只有第一个表达式中的int操作数是常量(0),而第二个表达式中的int操作数是变量(i)。因此,第2点被应用到了第一个表达式上,它返回的类型是char,而第3点被应用到了第二个表达式上,其返回的类型是对int和char运用了二进制数字提升之后的类型,即int。
条件表达式的类型将确定哪一个重载的print方法将被调用。对第一个表达式来说,PrintStream.print(char)将被调用,而对第二个表达式来说,PrintStream.print(int)将被调用。前一个重载方法将变量x的值作为Unicode字符(X)来打印,而后一个重载方法将其作为一个十进制整数(88)来打印。至此,谜题被解开了。
总之,通常最好是在条件表达式中使用类型相同的第二和第三操作数。否则,你和你的程序的读者必须要彻底理解这些表达式行为的复杂规范。
对语言设计者来说,也许可以设计一个牺牲掉了部分灵活性,但是增加了简洁性的条件操作符。例如,要求第二和第三操作数必须就有相同的类型,这看起来就很合理。或者,条件操作符可以被定义为对常量没有任何特殊处理。为了让这些选择对程序员来说更加容易接受,可以提供用来表示所有原始类型字面常量的语法。这也许确实是一个好注意,因为它增加了语言的一致性和完备性,同时又减少了对转型的需求。
分享到:
相关推荐
本文将深入探讨两个常见的Java谜题,这些谜题涉及到了Java中的取余运算符 `%` 和浮点数表示的不精确性。 首先,我们来看第一个谜题,关于判断奇数性的方法。在Java中,使用`i % 2 == 1`来检查一个整数`i`是否为奇数...
《Java解惑(中文版)》是一本专为Java初学者设计的学习资料,旨在帮助读者解答在学习Java过程中遇到的各种困惑。"solve65p"可能代表这本书包含65个问题或主题,每个都深入浅出地进行了讲解,旨在解决初学者在编程...
(十一)Java的运算符包括算术运算符、比较运算符、逻辑运算符、位运算符、赋值运算符等,掌握这些运算符的用法有助于写出更简洁、高效的代码。 这些面试题涉及到Java语言的核心概念和常见问题,理解和掌握它们能够...
《Java解惑》是一本专为Java初学者和进阶者设计的指南,旨在帮助读者解决在学习和实践中遇到的各种问题。这本书深入浅出地解析了Java编程中的常见困惑,涵盖了语言基础、类库应用、多线程、网络编程、异常处理、内存...
"JAVA解惑"的主题针对的是Java学习过程中遇到的一些常见问题和难点,旨在帮助开发者深入理解和解决这些问题。以下是基于这个主题和描述可能涵盖的一些关键知识点: 1. **Java基础**:这可能包括变量、数据类型、...
这份“Java解惑.pdf”文档很可能包含了解决Java开发者在编程过程中遇到的常见问题和困惑的详细解答。以下是可能涵盖的一些Java相关知识点: 1. **基础语法**:Java的基础语法包括变量、数据类型、运算符、流程控制...
Java编程语言中的“JAVA解惑”涉及到一些常见但容易引起混淆的概念,主要集中在整数的奇偶性判断和浮点数的精度问题上。 首先,我们来看“表达式谜题”。在Java中,判断一个整数是否为奇数通常会使用取余运算符 `%`...
"java解惑"这个主题旨在帮助初学者理解和解决在学习Java过程中遇到的问题,通过实例来深入浅出地讲解Java的基础知识,同时也强调了实用技巧和注意事项。 "Java解惑"的资料可能包含了两部分:`.chm`和`.pdf`格式的...
### JAVA解惑中的关键知识点解析 #### 谜题1:奇数性的判断 在《JAVA解惑》一书中,作者通过一系列实例介绍了Java编程语言中的一些不易掌握的知识点。其中一个例子是关于如何正确判断一个整数是否为奇数。 **原始...
【标题】:“臧圩人--JAVA解惑系列合集”是一个专门针对Java编程语言的教程集合,由知名讲师臧圩人编撰。这个合集旨在解答初学者和开发者在学习Java过程中遇到的各种困惑,帮助他们深入理解Java的核心概念和技术。 ...
《JAVA解惑》是一本专为Java爱好者设计的指南书籍,旨在帮助读者解决在学习和实践中遇到的各种Java编程难题。这本书以中文版的形式呈现,使得国内的Java学习者能够更轻松地理解和掌握其中的知识点。 Java是一种广泛...
**1.11 JAVA面试题解惑系列(十一)——这些运算符你是否还记得?** - **知识点**:复习Java中的运算符,包括算术运算符、比较运算符、逻辑运算符、位运算符等,以及运算符的优先级和结合律。 整体来看,臧圩人的...
### Java解惑知识点详解 #### 一、表达式谜题:奇数判断方法的问题与修正 **背景描述:** 在给定的代码片段中,提供了一个用于判断整数是否为奇数的方法`isOdd()`。该方法试图通过计算传入整数`i`对2取模的结果...
1. **基础语法**:Java的基础语法包括数据类型(如整型、浮点型、字符型和布尔型)、变量声明、运算符以及流程控制语句(如if-else,for,while,switch)。初学者可能会对这些概念的使用感到困惑,例如何时使用int...
在“Java解惑.zip”这个压缩包中,我们有“Java解惑.pdf”这份文档,它可能包含了对Java编程中的一些常见疑惑和难题的解答。 首先,让我们探讨“谜题1——表达式谜题”。在Java中,表达式是用于计算值的语句,它们...
Java编程语言中的“疑难解惑”常常涉及到对语言特性的深入理解,特别是在处理特定问题时。本篇文章将探讨两个常见的Java谜题,涉及取余运算符 `%` 和浮点数精度问题。 首先,我们来看“表达式谜题”。在Java中,`...
《JAVA面试题解惑系列合集》这篇文章详细地讨论了Java面试中常见的一些知识点和问题。它包括了从类的初始化顺序、String对象的创建数量、变量的覆盖、final关键字、传值和传引用的区别、字符串的处理、日期和时间的...
《JAVA解惑》是一本专为Java爱好者设计的书籍,旨在帮助读者解决在学习和使用Java过程中遇到的各种问题。这本书以PDF格式提供,方便电子阅读和保存。在深入探讨Java编程语言的过程中,它覆盖了从基础概念到高级特性...
### Java解惑知识点详解 #### 一、表达式谜题 **谜题1:奇数性** - **描述**:程序看似应该返回一个布尔值,表明一个数字是否为奇数,但结果却出乎意料。 - **解惑**:在进行模运算时,需要注意负数的情况。当输入...
《Java解惑》一书是为Java初学者和进阶者提供的一份宝贵参考资料,它旨在解答在Java编程过程中常见的困惑和难题。本书涵盖了Java语言的核心概念、语法特性以及实战应用,帮助读者深入理解Java编程的本质,提升编程...