《Java语言导学(原书第6版)》一一3.2 运算符

3.2 运算符
学习了如何声明和初始化变量之后,下面看看如何利用这些变量来做点事情。学习Java程序语言的运算符是个很好的切入点。运算符是一类特殊的符号,它们执行1个、2个或3个运算对象上的特定操作,然后返回结果。
研究Java程序语言的运算符时,先了解这些运算符的优先级可能会有帮助。表3-2根据优先级顺序列出了所有的运算符。越靠近表的顶端,运算符的优先级越高。优先级较高的运算符先计算,相对较低的后计算。同一行的运算符优先级相等。当表达式中出现优先级相等的运算符时,计算规则如下:赋值运算符从右到左计算,除此之外,其他所有的二元运算符从左到右计算。
编程过程中,有些运算符的出现频率会比其他的要高。例如,赋值运算符(=)比不带符号的右移位运算符(>>>)常用得多。因此,后续讨论先关注那些经常使用的运算符,然后介绍那些不常用的运算符。讨论过程中,我们会给出相应的代码实例,这些代码都可以编译和运行。研究这些代码的运行结果有助于巩固所学知识。

3.2.1 赋值运算符、算术运算符和一元运算符
1.?简单赋值运算符
简单赋值运算符(=)是最常用的运算符之一。Bicycle类中已经用过该运算符,它将右边的值指派给左边的运算对象:

该运算符也可用于指派对象引用。对象引用将在第4章中详细介绍。
2.?算术运算符
Java程序语言提供执行加法、减法、乘法和除法运算的运算符。这是个很好的机会将它们与基本数学中的概念相对应。唯一的新符号可能是%,它将一个运算对象除以另外一个运算对象并返回余数,如表3-3所示。

用下述ArithmeticDemo程序来测试这些算术运算符:



其输出为:

算术运算符和简单赋值运算符组合在一起,可以创建复合赋值运算符。例如,x+=1;和x=x+1;,它们的功能都是将x的值加1。
加法(+)运算符也用于连接两个字符串,如ConcatDemo程序所示。

程序最后在标准输出上显示变量thirdString的值“This is a concatenated string.”。
3.?一元运算符
一元运算符只要求一个运算对象,它们可以执行多种操作,如加1、减1、否定表达式、反转布尔值等操作,如表3-4所示。

下述UnaryDemo程序测试一元运算符。

递增/递减运算符都可以用作运算对象的前缀和后缀。result++;和++result;都将result的值加1。唯一的区别是前缀版本(++result)的计算结果为增加后的值,而后缀版本(result++)的计算结果为原始值。如果只是执行简单的递增或递减操作,选用哪种版本都没问题。但在大型的表达式中,递增/递减运算符的版本选择可能会造成很大的差异。
下述PrePostDemo程序举例说明前缀/后缀版本的一元运算符的使用方法:

3.2.2 等式运算符、关系运算符和条件运算符
1.?等式运算符和关系运算符
等式运算符和关系运算符用于判断一个运算对象大于、小于、等于或不等于另一个运算对象。大家对于其中的大部分运算符可能都很熟悉。切记,测试两个基本的值是否相等时,要用==而不是=。

用下面的ComparisonDemo程序来测试比较运算符:

程序输出如下:

2.?条件运算符
运算符&&和||在布尔表达式上执行条件与和条件或运算。这些运算符支持“短路”行为,也就是说,第二个运算对象只在需要时才计算。
&& 条件与
|| 条件或

用ConditionalDemo1程序来测试这些运算符:

另一种条件运算符是?:,通常认为是if-then-else语句(见3.4节)的简化版本。这个运算符也因有三个操作对象而被称为三元运算符。在下面这个例子中,该运算符的含义如下:如果someCondition为真,将value1的值赋给result;否则,将value2的值赋给result。
ConditionalDemo2测试?:运算符:

因为someCondition为真,所以程序在屏幕上输出1。如果?:运算符能提高代码的可读性,就用它来代替if-then-else语句(例如,当表达式紧凑且没有其他操作(如赋值)时)。
3.?类型比较运算符instanceof
instanceof运算符将对象与指定的类型进行比较,可用于测试对象是否为类的实例、子类的实例或者实现特定接口的类的实例。
下面的InstanceofDemo程序定义了一个父类(Parent)、一个接口(MyInterface)以及一个子类(Child),该子类继承Parent并实现接口MyInterface。

输出结果如下:

使用instanceof运算符时,切记null不是任何类的实例。
3.2.3 位运算符和移位运算符
Java程序语言支持在整数类型上执行位操作和移位操作,并提供相应的运算符。本小节介绍的运算符不是很常用,因此只做简短介绍,目的是告知大家还有这种运算符。
一元按位求补运算符(~)取反任意整数类型的位模式,将0转换成1,将1转换成0。例如,1个字节包含8个位,将该运算符运用于位模式为00000000的值,其位模式就转换为11111111。
带符号的左移运算符(<<)将位模式向左移,带符号的右移运算符(>>)将位模式向右移。运算符左边的运算对象是位模式,右边的运算对象是移动的位数。无符号的右移运算符(>>>)会在最左边移入0,而执行>>之后,最左边位置的值取决于其是否有符号。
按位与运算符(&)执行比特位上的与操作。按位异或运算符(^)执行比特位上的异或操作。按位或运算符(|)执行比特位上的或操作。
程序BitDemo使用按位与运算符将数字2打印到标准输出上。

3.2.4 小结
Java程序语言支持的运算符总结如下。
1.?简单赋值运算符
=  简单赋值运算符
2.?算术运算符

  •  加法运算符(也用于字符串连接)
  •  减法运算符
  •  乘法运算符
    /  除法运算符
    %  取模运算符
    3.?一元运算符
  •  一元加运算符;表示正值,没有该运算符时也表示正值
  •  一元减运算符;否定表达式
    ++  递增运算符;将值加1
    --  递减运算符;将值减1
    !  逻辑非运算符;反转布尔值
    4.?等式和关系运算符
    ==  等于
    !=  不等于
    >  大于
    >=  大于等于
    <  小于
    <=  小于等于
    5.?条件运算符
    &&  条件与(逻辑与)
    ||  条件或(逻辑或)
    ?:  三元运算符(if-then-else语句的简化版本)
    6.?类型比较运算符
    instanceof? 将对象和指定的类型进行比较
    7.?位与移位运算符
    ~  ?一元按位求补
    <<  ?带符号左移
    >>  ?带符号右移
    >>> ?无符号右移
    &  ?按位与
    ^  ?按位异或
    |  ?按位或
    3.2.5 问题和练习:运算符
    问题
  • 代码片段“arrayOfInts[j]>arrayOfInts[j+1]”包含什么运算符?
  • 考虑下述代码片段:

    a.代码执行前后i和n的值各是什么?
    b.如果使用前缀版本(++i)代替后缀版本(i++),那么执行代码后,i和n的值是什么?

  • 反转布尔值用什么运算符?
  • 用什么运算符来比较两个值,=还是==?
  • 解释代码“result=someCondition ? value1 : value2;”的含义。
    练习
  • 使用复合赋值运算符重写下述程序:

  1. 解释下述程序为什么会打印6两次:

答案
相关答案参考
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/QandE/answers_operators.html。

时间: 2024-08-18 10:56:26

《Java语言导学(原书第6版)》一一3.2 运算符的相关文章

《数据结构与抽象:Java语言描述(原书第4版)》一2.1.2 一组核心方法

2.1.2 一组核心方法 基于Java语言数组实现的ADT包吸收了教室示例中展现的一些想法.由此得到了类ArrayBag,它实现了在程序清单1-1中见到过的接口BagInterface.接口中的每个公有方法对应于ADT包的一个操作.我们记得,接口为包中的对象定义了泛型T.我们在ArrayBag的定义中也用到了这个泛型.类ArrayBag的定义可能相当难懂.该类确实有不少的方法.对于这样的类,你不应该定义整个类,然后试图去测试它.而是应该先确定一组核心方法(core method)来实现并测试这些

《数据结构与抽象:Java语言描述(原书第4版)》一P.1 封装

P.1 封装 如果你想学习驾驶,那么对汽车的哪些描述对你最有用?显然不是描述它的发动机如何周而复始地获取空气和汽油,点燃空气和汽油的混合物,然后排出的过程.当你想学习驾驶时,这样的细节是不必要的.事实上,可以以你的方式获知这些细节.如果你想学习驾驶,最有用的汽车描述是如下的这些特点: 如果你将脚踩在油门踏板上,汽车将开得更快. 如果你将脚踩在制动踏板上,汽车将慢下来并最终停止. 如果你将方向盘向右转,汽车将右转. 如果你将方向盘向左转,汽车将左转. 就像你不需要告诉想开车的人发动机是如何工作的一

《数据结构与抽象:Java语言描述(原书第4版)》一练习

练习 1.说明程序清单1-3中给出的类PiggyBank的每个方法:说明方法的目的:描述它的参数:写前置条件.后置条件和方法头的伪代码.然后写一个用于这些方法的Java接口,包括javadoc风格的注释. 2.假定groceryBag是一个包,它被表示不同杂货名字的10个字符串填满了.写Java语句,计数groceryBag中"soup"的出现次数并全部删除.不要从包中删除任何其他的字符串.报告包中出现的"soup"的个数.groceryBag中可能不包含"

《数据结构与抽象:Java语言描述(原书第4版)》一P.4.3 统一建模语言

P.4.3 统一建模语言 图P-4中的用例图是更强大表示法的一部分,这个表示法称为统一建模语言(Unified Modeling Language,UML).设计人员使用UML来说明软件系统中必需的类及它们的关系.UML能给出复杂系统的整体视图,比用自然语言或程序设计语言描述更有效.例如,英语可能有二义性,而Java代码提供更多的细节.给出明确的类之间的交互图,是UML的强项之一.除了用例图之外,UML还能提供类图,类图将每个类的描述放在类似于CRC卡的方框中.方框内包含类名.它的属性(attr

《数据结构与抽象:Java语言描述(原书第4版)》一2.2.1 可变大小数组

2.2.1 可变大小数组 策略.当教室满了时,能容纳更多学生的一种办法是移到一间更大的教室.用类似的方式,当数组满了时,可以将它的内容移到一个更大的数组中.这个过程称为调整(resizing)数组大小.图2-7显示两个数组:一个是有5个连续内存单元的原始数组,另一个数组(两倍于原始数组大小)在计算机的另一块内存中.如果将数据从原始的小数组中复制到新的大数组的开头部分,得到的结果像是扩展了原来的数组一样.这种机制的唯一不足是新数组的名字:你想让它与原始数组同名.马上就会看到如何完成这个工作. 细节

《数据结构与抽象:Java语言描述(原书第4版)》一1.1 什么是包

1.1 什么是包 设想一个纸袋,或反复使用的布袋,甚至一个塑料袋.当人们购物.打包午餐或者吃土豆片时会用到袋子.袋子里装着东西.在日常用语中,包(也称为袋子--译者注)是一种容器.但在Java中,容器(container)是一个对象,它的类派生于标准类Container.这样的容器用在图形程序中.在Java中,不把包(bag)看作一种容器,而是一种集合.包与其他集合的区别是什么呢?包仅仅是含有项,但没有按某种方式规定项的次序,也允许有重复的项.大多数的行为可由其他类型的集合执行.当描述本章中设计

《数据结构与抽象:Java语言描述(原书第4版)》一1.2 说明一个包

可以使用UML将方法表示为: 且将这行添加到类图中.可以使用一个布尔值方法来测试包是否为空,同样该方法没有参数.用伪代码及UML描述这个方法的规格说明 及 将这行添加到类图中. 注:因为通过查看getCurrentSize是否返回0就能检测包何时为空,所以并不真的需要操作isEmpty.但是它是所谓的便利方法(convenience method),所以很多集合都提供这样一个操作.现在想向包中添加给定的对象.可以将这个方法命名为add,并有一个表示新项的参数.可以写出下列伪代码: 我们可能试图让

《数据结构与抽象:Java语言描述(原书第4版)》一2.1.3 实现核心方法

2.1.3 实现核心方法 数据域.在定义任何核心方法之前,需要考虑类的数据域.因为包要保存一组对象,所以一个域是这些对象的数组.数组的长度定义了包的容量.可以让客户指定这个容量,我们也可以提供一个默认容量.另外,我们想跟踪包中当前项的个数.所以可以为我们的类定义如下的数据域: 并将它们加到图1-2中类的UML表示中.得到的表示如图2-2所示. 程序设计技巧:终态数组 通过声明数组bag是类ArrayBag的一个终态数据成员,可知变量bag中的引用不能改变.虽然以这种方式声明数组是一种好的做法,但

《数据结构与抽象:Java语言描述(原书第4版)》一JI2.1 基础

JI2.1 基础 当在一个方法内发生异常时,该方法创建一个异常对象,并将它传给Java运行时系统.我们说方法抛出(throw)一个异常.被抛出的异常是发给程序的其他部分的一个信号,表示某些意外的事情发生了.根据异常类的类型,以及异常对象通过其方法告诉我们的信息,代码可以对其进行适当的响应处理.当发现并响应异常时,就是处理(handle)异常. 异常属于不同的类,不过所有这些类都是标准类Throwable的后代.Throwable在Java类库中,不需要import语句就可以使用.异常分为以下三组

《数据结构与抽象:Java语言描述(原书第4版)》一1.4 像使用自动贩卖机一样使用ADT

1.4 像使用自动贩卖机一样使用ADT 假定你站在一台自动贩卖机前,如图1-3所显示,或者更高级的一台,休息一下,然后从贩卖机中买些东西! 当站在自动贩卖机前时,会看到它的界面.投入硬币并且按下按钮,就能购物了.下面是对自动贩卖机的观察结果: 你仅能执行机器的界面提供给你的特定任务. 你必须理解这些任务--即你必须知道买一瓶汽水应该怎么办. 你不能访问机器内部,因为锁着的外壳封装了它. 即使你不知道内部将发生什么,但你可以使用机器. 如果有人用改进版替换了机器内部的机制但没改变界面,你仍然能用同