《Java 7程序设计入门经典》一2.15 表达式

2.15 表达式

运算符、变量和字面量都是表达式(expression)的组成部分。当在程序中遇到表达式时,会计算该表达式。因为它在前面的程序中已经用过,所以读者可能对表达式已有相当的直观理解。另外,Java的表达式也与代数中的表达式类似。但是,现在还是要讨论表达式的一些方面。

2.15.1 表达式中的类型转换

在表达式中,可能将两种或多种不同类型但互相兼容的数据混合。例如,因为short类型和long类型都是数值类型,所以在表达式中将它们混合使用。当一个表达式中混合不同种类的数据,它们会转换为同一类型。这是通过Java的类型提升规则(type promotion rule)来完成的。
首先,所有的char值、byte值、short值都提升为int类型。其次,当一个操作数是long类型时,整个表达式提升为long类型。如果一个操作数是float类型的操作数,整个表达式提升为float类型。如果有任何操作数是double类型,结果是double类型。
类型提升只使用于在计算表达式中遇到的值,理解这一点很重要。例如,在表达式内byte类型提升为int类型,但在表达式外变量仍然为byte类型。类型提升只影响表达式的计算。
但是,类型提升会导致不希望的结果。例如,当一个算术运算与两个byte值有关时,下列情况发生:首先,将byte类型的操作数提升为int类型。当操作发生时,生成int类型的结果。于是,对两个byte值进行运算的结果是int型。这与直观感觉不同。考虑以下程序:

与直观感受相反,当把bb赋给变量i时,不需要强制类型转换,因为在计算表达式时,变量b已经提升为int类型。但是,如果将bb赋给b,需要使用强制类型转换将类型变回byte类型。记住,如果获得了与期望不同的类型,在表达式上会有提示不兼容的错误消息。否则,一切就都好。
同样的情况在执行与char类型有关的操作时也会发生。例如,在下面的代码片段中,由于表达式将变量ch1和ch2提升为int类型,需要使用强制类型转换转回char类型。

如果没有强制类型转换,将ch1加到ch2的结果就是int类型,不能赋给变量ch1。
强制类型转换不仅在赋值中的类型转换有用。例如,考虑下面的示例。它使用强制类型转换将数据转化为double类型来获得结果的小数部分。若不使用强制类型转换,则涉及的除法仅是整数除法。

程序输出如下所示:

2.15.2 空白和圆括号

在Java的表达式中,可以使用水平制表符和空格增加可读性。例如,下面两个表达式完全相同,但后者更易阅读:

圆括号从代数角度改变了其中运算的优先级。使用额外的圆括号不会导致错误,也不会降低表达式的执行速度。鼓励大家使用圆括号来使运行顺序更明确,便于后来人阅读程序。例如,请判断以下两个表达式中哪个更容易阅读:

时间: 2024-08-30 04:19:24

《Java 7程序设计入门经典》一2.15 表达式的相关文章

《Java 7程序设计入门经典》一3.15 使用continue语句

3.15 使用continue语句 也可能要求忽略循环的正常控制结构,提前开始下一次循环.这由continue语句完成.continue语句会有选择地跳过剩下的任何代码和对循环控制条件的判断,强迫开始下次循环.所以,从本质上看,continue语句与break语句具有互补关系.例如,下面的程序用continue语句帮助输出0-100之间的整数. 因为奇数会使循环的迭代提前结束并忽略println(),所以该程序只输出偶数.这使用返回除法余数的运算符%完成.如果该数是偶数,除以2后的余数就是0,i

《Java 7程序设计入门经典》一1.15 Java关键字

1.15 Java关键字 目前,Java语言定义了50个关键字,见表1-1.这些关键字,包括运算符和分隔符的语法,形成了Java语言的基础.这些关键字不能用作变量.类.方法的名字. Java保留关键字const和goto,但是不使用它们.在Java发展的早期,还保留其他关键字以便未来使用.但是,现在的Java规范只定义了表1-1中展示的关键字. 除了关键字外,Java还保留了以下名称:true.false和null.这是Java预定义的值.不可以把这些名字用于变量.类等的命名.

《Java 7程序设计入门经典》一导读

前 言 本书通过Java语言来讲解编程的基础知识.该书假设读者之前没有任何编程经验.本书首先介绍最基本的知识,例如,如何编译和运行Java程序:接着,讨论关键字.运算符和一些形成Java语言的构造.本书还会涉及Java的应用编程接口(Application Programming Interface,API)库.其中,包括Swing框架,它可以用来创建具有图形用户界面(Graphical User Interface,GUI)的程序.还包括集合框架,它可以用来存储对象集合.简而言之,本书旨在对J

《Java 7程序设计入门经典》一3.17 习题

3.17 习题 1.写一个程序,从键盘读入字符,直到接收到一个英文句号(.).程序需要计算输入的空格的个数.在程序结束时输出总结果. 2.请写出if-else-if梯队的一般形式. 3.针对下列程序 其中最后的else子句与哪个if配对? 4.写一个for循环语句,从1000计数到0,步进值为-2. 5.下面的代码片段是否有效? 6.请解释break语句的用途(包括其两种形式.) 7.在下面的代码片段中,break语句执行后会显示什么? 8.下面程序片段的输出是什么? 9.for循环中的迭代表达

《Java 7程序设计入门经典》一2.3 字面量

2.3 字面量 在Java中,字面量(literal)指人类可以阅读的固定值的表示.例如,数100是字面量.字面量也常常称为常量(constant).大多数字面量及其用法非常直观,前面的示例程序中已经以各种形式使用过它们.现在正式地解释它们. Java的字面量可以是任意基本数据类型.每种字面量的表示取决于类型.如前所述,字符常量由单引号包括.例如,'a'和'%'都是字符常量. 整数字面量是没有小数部分的数.例如,10和-10是整数字面量.浮点字面量有小数点,小数点后是小数部分.例如,11.123

《Java 7程序设计入门经典》一1.4 Java语言

1.4 Java语言 本书使用Java语言来讲解编程的基础知识.虽然其他编程语言也可以用来达到此目的,但是由于以下两个原因,本书选择了Java:首先,它是世界上使用最广泛的计算机语言之一.所以从实际的观点看,它是绝佳的学习语言.其次,它设计和实现了一些特性,这些特性使得对编程基础知识的介绍变得简单. 但是还有第三个原因.Java展现了现代编程的许多特点.对Java的理解可以使你像专业程序员一样看待和思考编程工作.它是这个时代定义的语言之一. 计算机语言演进是一个正在进行的历史过程,而Java是其

《Java 7程序设计入门经典》一2.16 习题

2.16 习题 1.为什么Java严格指定基本数据类型的范围和行为? 2.什么是Java的字符类型?它与其他语言的字符类型有什么区别? 3.判断正误:因为非零值是真值,所以boolean值可以是任何值. 4.给定输出: 仅使用一个字符串,写出利用println()方法产生这个输出的方法. 5.下面代码片段有什么错误? 6.请解释递增运算符前缀形式和后缀形式的区别. 7.请举例说明带有"短路"功能的AND运算如何用来防止除以0带来的错误. 8.在表达式中,byte类型和short类型会提

《Java 7程序设计入门经典》一3.1 从键盘输入字符

3.1 从键盘输入字符 到目前为止,本书中的示例程序都向用户显示信息,但不从用户接收信息.于是,只使用了控制台输出,没有使用控制台输入(即键盘输入).主要原因在于,许多Java输入需要依赖和使用本书还未讲到的特性.这些特性在后面才会提及.另外,在真实情况下,许多Java程序和applet是图形界面或是窗口界面的,而不是控制台的.因此,本书的例子很少使用控制台输入.但是,有一种控制台输入相对容易使用,那就是从键盘读入字符.因为本章有许多需要用到这个特性的例子,所以在这里讨论它们. 我们将用Syst

《Java 7程序设计入门经典》一2.11 速记赋值运算符

2.11 速记赋值运算符 Java提供了特别的速记(shorthand)赋值运算符,用于简化一些赋值语句代码.让我们从一些例子开始了解速记赋值运算符.赋值语句: 相同.这两个语句都是将x的值减去100赋予变量x. 在Java中,速记运算符可以用于所有的二元运算符(即需要两个操作数的运算符).速记运算符的一般形式为: var op= expression; 于是,算术速记运算符和逻辑速记运算符有以下几种: 因为这些运算符将运算与赋值结合起来,它们正式的名称是复合赋值运算符(compound ass