购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4 运算符与表达式

在每一种编程语言中,都会涉及运算符与表达式。简单来说,运算符是一种用于执行具体操作的符号,例如加、减、乘、除等。而表达式则由运算符、操作数和其他元素组成,用于计算出一个值或者一个结果。

运算符可以分为不同类型,例如算术运算符(加、减、乘、除)、比较运算符(大于、小于、等于等)、逻辑运算符(与、或、非)等等。表达式通常是由一系列变量、常量以及运算符组成,可以进行数学运算、逻辑判断等操作,最终得到一个值或者一个结果。

在程序设计中,运算符与表达式是编程的基础。使用运算符和表达式可以实现各种各样的计算和操作,从简单的数值计算到复杂的逻辑判断都可以通过它们来实现。

【任务驱动】

1.任务介绍

给定任意整型变量a、b和result1,result2,result3,按照以下要求完成操作:

使用赋值运算符将a变量的值设为18,b的值设为5;

使用算术运算符对a、b进行求模运算,将结果存储到一个新的变量result1中,并输出;

使用算术运算符计算a与b的差,将结果存储到一个新的变量result2中,并输出;

使用关系运算符判断result2是否大于0,若大于0,将判断结果存储到变量result3中,并输出;

请写出这个程序的代码实现。

2.任务目标

编写Java Application,定义必要的变量,使用所学的运算符进行简单的运算,并在屏幕上输出相应的运算结果。

3.实现思路

分析任务要求,结合前述所学变量定义的相关知识,根据赋值运算符、算术运算符、关系运算符的使用规则与特点,完成相关运算。

【知识讲解】

1.赋值运算符

在Java语言中,符号“=”是赋值运算符,不是“相等”(相等运算符是“==”,见关系运算符的叙述)。赋值运算分为两类:一是简单赋值运算;二是复合赋值运算。

(1)简单赋值运算

简单赋值运算的一般语法格式如下:

赋值运算的执行过程是:

首先,计算赋值运算符右端的表达式。当赋值运算符两侧数据类型不一致时,将表达式值的类型自动转换成变量的类型。接着将表达式的值赋值给变量,即存储到与变量对应的存储单元中。

完成一个赋值运算的表达式称为赋值表达式,赋值表达式是先计算表达式的值,然后将表达式的值赋值给变量。

例如,表达式x=x+1,表示完成表达式x+1的计算,将计算结果赋值给变量x。

注意:

①赋值时“=”两侧数据类型不一致时,按默认转换或强制转换原则处理。

②赋值时的类型转换是指自动加宽转换,这样的自动转换只能由简单类型向复杂类型转换,不能从复杂的转换成简单的。

byte-> short->int->long->float-> double

从byte开始,从左到右均能实现自动转换,反之则不能。

例如,以下代码说明int类型能自动转换成double类型:

③整型常量赋给byte,short,char等类型变量,还需要要考虑其表数范围。

④在赋值中,允许连续赋值,如以下代码。

这里经过连续赋值后,x,y,z的值均为100。

(2)复合赋值运算符

复合赋值运算符是一种快捷的赋值方法,可以简化代码并提高代码的可读性。它通常由一个普通的数学或位运算操作符和等号组成。使用复合赋值运算符时,会将原始变量与另一个值进行运算,并将结果存储回原始变量中。

例如,如果有两个整型变量a和b,要将a加2的结果保存到a中,可以使用如下的复合赋值运算符

其中,“+=”是复合赋值运算符,即将a加上2之后再将运算结果赋值回a本身。同样,还有其他的符合赋值运算符,比如“-=”“=”“/=”“%=”等,都可以通过类似的方式实现对变量的赋值操作。

例如:

2.算术运算符

算术运算要求操作数的类型是数值类型的(整数类型和浮点数类型)。运算时,只需一个操作数的是单目运算,需两个运算分量的是双目运算。

(1)双目运算符

双目算术运算符:+(加)、-(减)、(乘)、/(除)、%(求余数)。

表2-4 算术运算符

注意 :当“/”号在整数两端时,为整除运算。如:7/3结果是2;1/2结果是0;((float)1)/2结果是0.5。

加、减、乘、除和求余数运算都是双目运算符,结合性都是从左至右。取正和取负是单目运算符,结合性是从右至左,其优先级高于+、-、*、%等双目运算符。

“/”为除法运算符,当除数和被除数均为整数类型数据时,则结果也是整数类型数据。例如7/4的结果为1。“%”为求余数运算符,求余数运算所得结果的符号与被除的符号相同。例如:5%3的结果为2,-5%3的结果为-2,5%-3的结果为2。

(2)单目运算符

自增运算符“++”和自减运算符“--”都是单目运算符,单目运算符只有一个操作数。

单目运算符位置,决定了运算的顺序,位置不同,对操作数变量没有影响,却会改变整个表达式的值。因此需要按照位置,分类进行讨论。

①运算符在操作数变量前面,先自增,再参与运算。如:

运算结果:x=3,y=12。

在该例中,首先将变量x初始化为2,接着,对变量x进行前缀自增运算(++x),把x的值从2变成了3,再将得到的3乘以4,得到12,并将结果存储在变量y中。

②运算符在操作数变量的后面,先参与运算,再自增。如:

运算结果:x=3,y=8。

在该例中,首先将变量x初始化为2。接着,在表达式中使用后缀自增运算符(x++),这意味着x的值,将会在计算表达式之后才被自增。因此,在计算表达式时,x的值仍然是2,同时表达式结果是2*4=8。

然后,将上一步计算得到的结果(8)存储在变量y中,此时变量y的值为8。

最后,将x的值从2增加到3。所以现在x的值为3,而y的值为8。

上述两个例子说明,对变量进行自增或自减运算,用前缀形式或用后缀形式,对变量本身来说,效果是相同的,但表达式的值却不相同。

自增自减运算符的使用,使程序编写更加简洁和高效,但要注意“++”和“--”的运用只能是变量,不能是常量或者表达式。例如,8++或(m +n)++都不是合法的。

3.关系运算

关系运算符主要用于比较两个值的大小或者相等性,通常返回一个布尔值(true或false)。常见的关系运算符如表2-5所示。

表2-5 关系运算符

以上关系运算符可以应用于大多数的数据类型,包括整型、浮点型和字符型等。需要注意的是,在使用这些运算符时,两个操作数一般应是同一种数据类型,否则可能会出现精度或类型转换错误。

在该代码中,定义了两个整型变量x和y,分别赋值为5和7。接着,使用关系运算符进行比较,并将比较结果赋值给布尔类型的变量b和c。

b=(x==y):使用等于运算符(==)来比较x和y的大小,由于5不等于7,因此表达式结果为false,且该值被赋给变量b,所以此时b的值为false。

c=x <y:使用小于运算符(< )来判断x是否小于y,由于x为5,y为7,因此表达式结果为true,且该值被赋给变量c,所以此时c的值为true。

因此,最终的运算结果为:

在运算中,关系运算符的优先级低于算术运算符的优先级。例如,对于x+y> z式子,会先进行x与y的加法运算,再与z进行关系比较。

另外,各个关系运算符的优先级并不完全相同。<、< =、> 、> =的优先级高于==、!=,运算中要注意识别。

4.逻辑运算

逻辑运算用于描述逻辑表达式,实现连续多个条件的逻辑与、逻辑或、逻辑否定的判定。

其中:运算符“ ”和“||”是双目运算符、运算符!是单目运算符。逻辑运算的操作数必须是布尔型的,结果也是布尔型的。

逻辑否定“!”的优先级高于算术运算符的优先级。逻辑与“ ”和逻辑或“||”的优先级低于关系运算符的优先级。

表2-6是逻辑运算的“真值表”,表中列出当运算分量a和b的值在不同组合情况下,各种逻辑运算的结果。

表2-6 逻辑运算真值表

逻辑运算可省略括号,例如:

需要特别指出的是,Java语言在进行连续的逻辑运算时,不分逻辑与和逻辑或的优先级进行计算,而是顺序进行逻辑与和逻辑或的计算,一旦逻辑表达式能确定结果,就不再继续计算。具体如下:

(1)对表达式a b,当a为false时,结果为false,不必再计算b;仅当a为true时,才需计算b。

(2)对表达式a||b,当a为true是,结果为true,不必再计算b;仅当a为false时,才需计算b。

例如:设有a=b=c=1,计算++a> =1||++b <++c。从左到右顺序逻辑或表达式,先计算子表达式++a> =1,变量a的值变为2,++a> =1为true,整个逻辑或表达式的值已经为true,不再计算右边的子表达式++b <++c。因而变量b和c的值不变,仍为1。

5.条件运算

条件运算是一个三目运算,一般形式如下:

条件运算的执行过程是:

(1)计算逻辑表达式。

(2)如果逻辑表达式的值为true,则计算表达式1,并以表达式1的值为条件运算的结果(不再计算表达式2)。

(3)如果逻辑表达式的为false,则计算表达式2,并以表达式2的值为条件运算的结果(未计算表达式1)。

例如:

如果x> y条件为true,则上述表达式取x+5的值,否则取y-4的值。

条件运算符(?:)的优先级高于赋值运算符,低于逻辑运算符,也低于关系运算符和算术运算符。例如:

条件运算符的性为“自右至左”。

例如:

条件表达式的返回值类型由表达式1和表达式2的类型确定。

6.其他运算

除前面介绍的运算外,还有其他运算,本节只介绍位运算和移位运算。位运算和移位运算实现对二进制位串数据的运算,主要应用于与计算机内部表示直接有关的运算,读者可以跳过这些内容。

7.表达式

表达式(expression)是由运算符、操作数和其他子表达式组合而成的计算式。在程序中,表达式可以用来计算并返回一个值,这个值可以是各种数据类型,例如整数、浮点数、布尔值、字符等。有以下示例表达式。

5+3:该表达式使用加法运算符将5和3相加,计算结果为8。

x y-z:该表达式使用乘法和减法运算符,比较三个变量x、y和z的值,并对它们进行相应的运算。具体计算顺序要根据优先级规则决定。

a> b||c<d:该表达式使用大于号、小于号和逻辑或运算符,比较四个变量的值,并对它们进行相应的运算。如果a比b大或c比d小,那么表达式的值为true,否则为false。

总之,表达式是编程语言中的基础概念,灵活地运用表达式对编程水平的提高十分重要。

【动手实践】

1.完成任务驱动中的实践任务

源文件2-5 TestOperator1.java

在上述代码中,首先给变量a和b赋值,然后使用算术运算符计算a和b的模,将结果存储到变量result1中,并输出。接着,再使用算术运算符计算a和b的差,将结果存储到变量result2中,并输出。最后,使用关系运算符判断result2是否大于0,将判断结果存储到变量result3中,并输出。

2.运算符测试

在实际项目中,经常会使用到逻辑运算符,试着运行下面的代码,对运行结果进行分析。

源文件2-6 TestOperator2.java

运行结果为:

在该例中,(14> 36)中14小于等于36,因此该表达式的返回值为false,将其赋值给变量a。而根据Java语言中非运算符的规则,变量x的值应该为true,变量y的值则为false,而变量z的值是true。

最后,使用System.out.println()方法将各个变量的值输出到控制台上。

【拓展提升】

1.使用Scanner类与运行环境交互

Scanner是一个基于正则表达式的文本扫描器,它可以从文件、输入流、字符串中解析出基本类型值和字符串值。使用Scanner类可以很方便地获取用户的键盘输入,Scanner类提供了多个构造方法,不同的构造方法可接受文件、输入流、字符串作为数据源,用于从文件、输入流、字符串中解析数据。

有关构造方法的知识,将在后续的章节详细讲解,这里仅介绍使用Scanner类与环境交互的最一般方法,以便后续编程案例的展开。

Scanner主要提供了下面两个方法来扫描输入。

hasNextXxx():是否还有下一个输入项,其中Xxx可以是int、long等代表基本数据类型的字符串。如果需要判断是否包含下一个字符串,则可以省略Xxx。

nextXxx():获取下一个输入项。Xxx的含义与前一个方法中Xxx相同。在这里主要介绍使用nextXxx()方法,在命令行字符界面接收数据的方式。

Scanner类在包java.util中,因此使用该类,需要导入java.util包才能使用。

可以使用下述两句代码中的任一句,导入相应的包:

Scanner类中通过下列方法,可以读取用户在键盘上输入的数据,如表2-7所示。

表2-7 Scanner类中的常用方法

这些方法可以根据不同场景和需求读取用户在控制台中输入的不同数据类型。注意,使用Scanner类时需要避免输入无效数据类型,以免程序抛出异常。

2.Scanner类应用举例

【实例】从键盘输入一个整数,一个实数,求解两个数的乘积,并将求解结果输出。参考代码如下。

源文件2-7 TestScanner.java

在这段代码中,首先导入java.util.包,以使用Scanner类。然后,创建一个Scanner对象reader,将System.in作为参数传递给Scanner的构造方法,以指定从控制台获取输入。

代码声明了两个变量num1和num2,分别用来存储从用户输入中获取的整数和浮点数。通过调用reader.nextInt()获取用户输入的第一个数,并将其赋值给num1变量;通过调用reader.nextDouble()获取用户输入的第二个数,并将其赋值给num2变量。

最后,程序将计算num1和num2的乘积,并使用System.out.println()方法将结果输出到控制台。注意,在使用Scanner类获取用户输入时,要确保输入的数据类型与变量的数据类型相匹配,否则可能会出现输入错误或异常。

该程序的运行结果为: 6oCuKE6lWEjN9QmLIS7oz+3lmBh+KNV50W941Jg2VUfpmHqtCLCZbusTxKXbj9W1

点击中间区域
呼出菜单
上一章
目录
下一章
×