算术运算符是一种将数值作为操作数并执行算术运算(例如加法和减法)以计算另一个数值的运算符。下表列出了 Java 中的所有算术运算符。其中运算符只能与数值类型的操作数一起使用。也就是说,算术运算符的两个操作数都必须是 byte、short、char、int、long、float 和 double 类型中的某一种。
下面的例子首先以int类型的数据进行演示。
16.1 + 运算符
这个运算符比较好理解,它是一个二元运算符,用于数值之间的操作,就是进行数学意义上的求和;不过它还能用于字符串之间的拼接。另外,如果直接放在数据或变量前面则表示正数,此时也可以认为它是一个一元运算符,本小节主要探讨作为二元运算符进行数值相加的场景。
int num1 = 1;
int num2 = num1 + 10;
System.out.println(num2); // 输出 11
16.2 - 运算符
和 + 类似,- 运算符主要用于两个数值之间的差,也可以变量前获取其相反数。
int num3 = 10 - 5;
System.out.println(num3); // 输出 5
16.3 * 运算符
用于计算两个数值的乘积,示例如下:
System.out.println(2 * 5); // 输出 10
注意这里的乘法使用的是字母星号来表示。
16.4 / 运算符
计算两个数值的商。示例如下:
System.out.println(10 / 5); // 输出 2
System.out.println(-10 / 2); // 输出 -5
System.out.println(10 / 3); // 输出 3
System.out.println(11 / 3); // 输出 3
第1行和第2行代码没有什么需要解释的,第3行代码需要注意的是,我们从数学计算的角度会认为结果是 3.3333…、但是结果却是3,这是因为参与运算的两个数默认都是int类型,那么结果也只能是int类型。
第4行需要留意的是没有采取四舍五入的方式将结果计算为4,而是直接舍弃小数位,保留正数为 3、
同时也要注意,要避免使用零作为除数,,比如:
System.out.println(1 / 0); // 会抛出异常
但是如果是浮点型数据除以0,则不会排除异常,会输出 Infinity,即无穷大。
System.out.println(1.0 / 0);
16.5 % 运算符
计算两个数值的余数,也称为取模,符号取决于被除数。示例如下:
System.out.println(10 % 3); // 输出 1
System.out.println(-10 % 3); // 输出 -1
System.out.println(10 % -3); // 输出 1
System.out.println(-10 % -3); // 输出 -1
对于%运算的结果,可以先取绝对值计算,然后将计算结果的符号与被除数保持一致即可。
16.6 复合赋值运算符
与数学运算相关的复合赋值运算符包括:+=、-=、*=、/=、%= 。下面主要以 += 为例。
如果针对某变量进行了运算之后的结果赋值给该变量,常规写法是这样的:
int num1 = 1;
num1 = num1 + 5; // num1自身增加5
而符合赋值运算符使用时,代码更简洁,在编译器内部也有一定的性能优化:
int num1 = 1;
num1 += 5; // 效果上与 num1 = num1 + 5;一样
当然右边参与运算的数也可以是负数:
int num1 = 1;
num1 += -5; // num1自身减少 5,相当于 num1 -= 5;
其他类似的复合赋值运算符就不再赘述了。
16.7 自增自减运算符
如果仅仅针对数值类型的变量进行自增1或自减1,可以使用更加简单的语法。
自增自减运算符的一元运算符,用于对数值类型的操作数自身进行加1或减1,可以出现在操作数的前面或后面。
- ++:自增运算符,对操作数自增1
- –:自减运算符,对操作数自减1
int num1 = 1;
num1++;
System.out.println(num1); // 输出 2
int num2 = 1;
num2--;
System.out.println(num2); // 输出 0
上述代码的结果很好理解,但是如果自增自减运算符参与运算之后的表达式仅需参与运算,则自增自减运算符在变量前与在变量后是有区别的。先说结论:
- 运算符在前:先执行自增或自减再参与运算
- 运算符在后:先参与运算再执行自增或自减
比如以下示例代码:
int num3 = 3;
System.out.println(num3++); // 先参与运算,即先输出3,然后再自增为4
System.out.println(num3); // 输出自增后的结果 4
int num4 = 4;
System.out.println(--num4); // 先自减结果为3,然后再输出结果3
System.out.println(num4); // 输出自减后的结果3
对byte、short类型的数据自增或自减,其类型不会变,如直接加1或减1,其结果的数据类型会成为int,比如:
byte b = 1;
b++;
b = b + 1; // 编译错误
看起来第2行与第3行是一个效果但是对于 b+1 这个表达式,由于1 是int ,会导致整个运算结果为int,就没法直接给byte类型的b赋值了。
16.8 算术运算中的通用规则
-
参与运算的数据类型为short,byte,char类型则自动转换为int,char类型会转为对应的ASCII码
-
计算结果的数据类型为参与运算数据的最大范围数据类型,比如:1 +1.1 那么结果就是double类型
-
/ 和 % 不能将0作为除数,但是0.0或0.0D作为除数返回特殊的值
-
float与double计算不精确,之前介绍浮点数据类型演示过,可以参考Java学习之旅第一季-10:数据类型之浮点数值类型
-
最大值或最小值计算可能会溢出导致结果不正确,但不报错,比如: Integer.MAX_VALUE+1,结果为 -2147483648
16.9 小结
本小节主要介绍了Java中的算术运算符,包括基本的加、减、乘、除、求余等,还有复合赋值运算符及自增自减运算符的使用及注意事项。

被折叠的 条评论
为什么被折叠?



