首页 > 编程语言 >第二章《Java程序世界初探》第5节:算术运算符

第二章《Java程序世界初探》第5节:算术运算符

时间:2022-12-29 12:04:58浏览次数:61  
标签:操作数 Java 运算 ++ System 运算符 初探 println

在学习本小节内容之前,各位读者必须先理解几个概念:运算符、操作数和表达式。所谓“运算符”就是指具有一定运算意义的符号,例如+、-都是运算符。根据运算符完成运算所需数据量的不同,可以把运算符分为单目运算符、双目运算符和三目运算符。例如,完成加法运算的加号(+)需要两个数据,因此它就是一个双目运算符。专业上,把参与运算的数据称为“操作数”。操作数可以是一个变量,也可以是一个常量,只要它参与了运算,都可以被叫做操作数。由运算符与操作数组成的、并且能够计算出结果的式子称为“表达式”,例如“1+2”就是一个表达式,它由操作数1和2以及运算符+所组成。其实,表达式也可以用来当作操作数,例如在表达式“2*5+3*4”中,“2*5”和“3*4”本身是表达式,但它们又可以被看作是“+”运算符的操作数。

从本小节开始,将详细介绍Java语言的各种运算符。运算符除了可以根据操作数的多少进行分类之外,还可以根据功能进行分类。如果按照功能对运算符分类,Java语言的运算符可以分为6大类,如表2-4所示。

表2-4 Java语言运算符

类型

运算符

算术运算符​

+, -, *, /, %, ++, --​

赋值运算符​

=, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, >>>=​

关系运算符​

==, !=, >, >=, <, <= ​

逻辑运算符​

!, &&, ||, &, |​

条件运算符​

?:​

位运算符​

&, |, ^, <<, >>, >>>, ~​


本小节重点讲解算术运算符。算术运算符用来完成算术运算,算术运算符中既有双目运算符,也有单目运算符,在此首先讲述双目算术运算符。

2.5.1 双目算术运算符

双目算术运算符包括+、 -、 *、 /和 %,它们分别表示加、减、乘、除和求模。其中*和/这两个运算符与数学中的×和÷的意义相同,但写法不同,初学Java的读者稍加注意即可。而%并不表示数学中“百分比”的概念,它表示“求余数”运算,专业上也把求余数称为“求模”。【例02_02】展示了求模运算符的用法:

【例02_02 求模运算符的使用】

Exam02_02.java

public class Exam02_02 {
public static void main(String[] args) {
System.out.println("7%3=" + 7 % 3);
System.out.println("7%-3=" + 7 % -3);
System.out.println("-7%3=" + -7 % 3);
System.out.println("-7%-3=" + -7 % -3);
}
}

程序运行结果如下:

7%3=1
7%-3=1
-7%3=-1
-7%-3=-1

双目算术运算符用法难度不大,但初学者还是需要注意两个细节:

1.如果两个操作数类型相同,则经算术运算所得结果与操作数类型也相同。

这句话的意思是说:如果两个int型的操作数进行算术运算,那么运算的结果必然也是int型,而两个double型的操作数进行运算,其结果必然也是double型,其他类型也是如此。这条规则虽然很容易理解,但初学者往往在做除法运算时因为不知道这条规则而导致出错。例如:

System.out.println(4/5);

很多初学者“想当然”的认为输出结果应该是0.8,但实际输出结果却是0。运算结果为0的原因很简单,就是因为数字4和5都是int型,因此最终的运算结果也是int型。有人会问:“4除以5”从数学的角度来看,运算结果是0.8,即便转换成整数,按照四舍五入的原则,运算结果也应该是1,但为什么运算结果是0呢?这是因为两个整数做除法运算,如果不能“整除”,则虚拟机不会进行四舍五入的操作,而是把运算结果的小数部分全部“砍掉”,因此“4除以5”虽然从数学的角度来看运算结果是0.8,但被虚拟机砍掉小数部分之后,就变成了0。

编码时如果忽视这条规则会导致程序中很多计算结果出现错误。如果希望在做除法运算时能得到一个包含小数部分的精确计算结果,则必须用浮点数进行计算。因此可以把原来的代码改为:

System.out.println(4/5.0);

经过修改之后,运算结果就变成了0.8,实现了准确计算。但在修改过的代码中,只有一个操作数被改为了浮点数,另一个操作数仍然是整数,这样两个操作数的类型变得不相同。那么,如果两个操作数的类型不相同,又有什么样的运算规则呢?在这种情况下,需要先把其中一个操作数的类型转换成与另一个操作数相同类型,转换的原则是“向高大看齐”。这里所说的“高”是指精度高,而“大”是指占据内存空间大。

例如:在“4/5.0”中,4是整数,5.0是浮点数。浮点数因为能表示小数部分,因此它的精度高于整数,所以运算时会把整数4先转换成浮点数4.0,然后再完成除法运算。这就是“向高看齐”。而如果一个int型操作数和一个long型操作数进行算术运算,因为long型变量所占内存空间更大,因此会把int型操作数先转换成long型,然后再完成算术运算,这就是“向大看齐”。两种情况综合起来就是“向高大看齐”。

但是,当“高”与“大”出现了冲突时该怎么办呢?例如,float型操作数与long型操作数相加,float型数据精度高,而long型数据占据内存空间大。在这种情况下“大”要让位于“高”, 也就是说先把long型操作数转换成float型,再进行运算,这样可以保持运算结果具有更高的精度。

2.算术运算可能会导致溢出现象

所谓“溢出”是指数据太大而导致数据无法正确表示的现象。例如:

System.out.println(2000000000+2000000000);

按常理说,这条语句的输出结果应该是4000000000,但真实的输出结果确实-294967296!为什么会出现错误的输出结果呢?就是因为在虚拟机看来2000000000是一个int型数据,而int型数据所能表示的最大值是2147483647,而4000000000已经超出了这个最大值。因此出现表示错误的情况,这种情况在专业上叫做“溢出”。解决这个问题的思路是:让虚拟机把2000000000当作long型数据看待,这样运算结果也变成long型,因此不会超出表示范围。为了实现这个效果,需要在操作数的后面加上字母L:

System.out.println(2000000000L+2000000000L);

long型数据的表示范围远远大于4000000000,因此修改代码后将不再出现溢出现象。long类型的数据虽然表示范围很大,但终究也会有上限。关于如何解决long类型数据超过上限的问题,本书会在后文的《BigInteger类的使用》这一小节中详细讲述。

溢出现象只在数据超过表示范围最大值时才出现。为了避免溢出现象的出现,需要程序员在写代码时对所处理的数据的大小提前做一下估算。例如,程序中如果只是表示某个班级的人数,那么使用int型的变量就足够了,但如果表示的是全球人口数量,用int型变量则会出现溢出错误。

2.5.2单目算术运算符

单目算术运算符包括++和--,它们分别被称为“自增”和“自减”运算符。“自增”是指变量的值增加1,而“自减”则是指变量的值减少1。无论是增加还是减少,值都会发生“变化”,因此++和--运算符的操作数只能是变量而不能是常量,例如以下代码就是一种典型的错误写法:

2++;

++和--运算符都有前缀形式和后缀形式。前缀形式的++和--遵循“先自增(减)后引用”的运算规则,而后缀形式的++和--则恰好相反,遵循“先引用后自增(减)”的运算规则。所谓“引用”就是使用变量的值进行运算。【例02_03】展示了前缀和后缀形式++的运算效果:

【例02_03 自增运算符的使用】

Exam02_03.java

public class Exam02_03 {
public static void main(String[] args) {
int a = 1, b = 1;// 声明a、b两个变量,并全部赋初始值为1
int r1, r2;
System.out.println("前缀形式的++");
r1 = ++a;// ①
System.out.println("a=" + a);
System.out.println("r1=" + r1);

System.out.println("后缀形式的++");
r2 = b++;// ②
System.out.println("b=" + b);
System.out.println("r2=" + r2);
}
}

程序运行结果如下:

前缀形式的++
a=2
r1=2
后缀形式的++
b=2
r2=1

程序中标记为①的语句,采用了前缀形式的++,按照“先自增后引用”的运算规则,首先对变量a的值加1,使得a从1变成了2,然后再把a的新值,也就是2赋值给r1,这样r1的值也是2。因此在输出结果中a和r1都是2。而标记为②的语句,采用的是后缀形式的++,按照“先引用后自增”的运算规则,先使用变量b的值1为r2赋值,所以r2的值是1,然后再对b的值加1,最终使得b的值变成了2。因此在输出结果中b的值是2,而r2的的值为1。--的前后缀形式遵循相同运算规则,只不过对变量值做的是减1的操作,所以在此不再举例。

其实,仅由++或--运算符与一个变量就可以独立构成一条语句。在这种情况下,前缀和后缀形式的运算效果相同,都是对变量的值加1或减1,【例02_04】展示了独立使用自增运算符的运算效果:

【例02_04 独立使用自增运算符】

Exam02_04.java

public class Exam02_04 {
public static void main(String[] args) {
int a = 1, b = 1;// 声明a、b两个变量,并全部赋初始值为1
System.out.println("前缀形式++");
++a;// ①
System.out.println("a=" + a);

System.out.println("后缀形式++");
b++;// ②
System.out.println("b=" + b);
}
}

程序运行结果如下:

前缀形式的++
a=2
后缀形式的++
b=2

代码中标记为①和②的语句都仅仅由++运算符与一个变量构成,再无其他运算符和操作数。两条语句分别使用了前缀和后缀形式的++。在这种情况下,虽然++与变量的相对位置不同,但都是对变量完成自增操作,所以运算的效果也是完全相同的,语句执行结束后a和b的值都变成了2。--运算符也可以和变量独立构成语句,起到的效果都是对变量的值减1。

另外在这里要特别提醒各位初学Java的读者:尽量不要在一条语句中对同一个变量多次使用++或--运算,例如:

int a = 1;
int b = a++ + ++a;//①
int c = a++ + a++;//②

在代码中,①和②都在同一条语句中两次对变量a进行了++运算。虽然这两条语句都没有语法错误,但都很容易让人产生语义分歧,甚至Java语言和其他语言对这两条语句的执行效果也并不相同。所以建议各位读者尽量避免在代码中使用这样的写法。

除此文字版教程外,小伙伴们还可以点击这里观看我在本站的视频课程学习Java。

标签:操作数,Java,运算,++,System,运算符,初探,println
From: https://blog.51cto.com/mugexuetang/5976632

相关文章

  • 第二章《Java程序世界初探》第6节:赋值运算符
    ​赋值运算符可以分为两类:普通赋值运算符和复合赋值运算符。普通赋值运算符只能起到简单的赋值作用,而复合赋值运算符则是先完成一次其他类型的运算然后再进行赋值操作。本小......
  • Triple 协议支持 Java 异常回传的设计与实现
    作者:ApacheDubboContributor陈景明背景在一些业务场景,往往需要自定义异常来满足特定的业务,主流用法是在catch里抛出异常,例如:publicvoiddeal(){try{......
  • 跟光磊学Java-Windows版IntelliJ IDEA安装和卸载
    IntelliJIDEA  安装、获得许可后才能使用IntelliJIDEA,如果不想使用IntelliJIDEA那么又应该如何卸载呢?1.IntelliJIDEA下载访问JetBrains官网,访问地......
  • 跟光磊学Java-macOS版IntelliJ IDEA设置
    IntelliJIDEA  在使用IntelliJIDEA开发项目之前还需要进行一些基本的设置,完成这些设置以后能让项目开发更加顺畅1.如何打开设置窗口在进行IntelliJIDE......
  • Triple 协议支持 Java 异常回传的设计与实现
    作者:ApacheDubboContributor陈景明背景在一些业务场景,往往需要自定义异常来满足特定的业务,主流用法是在catch里抛出异常,例如:publicvoiddeal(){try{......
  • 【Java】Tips
    GET还是POST?GET比POST更简单更快,可用于大多数情况下。不过,请在以下情况始终使用POST:缓存文件不是选项(更新服务器上的文件或数据库)向服务器发送大量数据(POST无大......
  • 跟光磊学Java-macOS版IntelliJ IDEA开发Java项目
    IntelliJIDEA  配置IntelliJIDEA后,就可以用它开发Java项目了,这里会手把手带领大家从头开始开发一个多模块的java项目1.IntelliJIDEA开发Java项目的流程......
  • 第二章《Java程序世界初探》第1节:认识Java语言的变量
    ​如果编写一个求绝对值的程序,开发者可以把程序设计为由用户从控制台上任意输入一个数字,然后计算这个数字的绝对值并输出到控制台上。为了完成这个操作,需要先向计算机申请一......
  • 第二章《Java程序世界初探》第2节:常量的使用
    ​所谓“常量”,就是指一个固定不变的量,例如圆周率π的值是固定不变的,因此π就是一个常量。程序员在写代码时总是会大量的使用到常量。比如在一段程序中需要计算机圆形的面积......
  • 第二章《Java程序世界初探》第3节:在程序中添加注释
    ​注释的作用是解释程序。一段程序中如果添加了合理的注释,可以帮助人们快速、准确的理解程序。Java语言中注释有三种:1.单行注释​单行注释的写法是“//”,编译器会认为“//”......