运算符尽管很基础,但也存在一些细小的知识点会遗漏,不清楚的情况。做记录,以备遗忘吧。
算数运算符中的 / 和 %
对于整型数据
整型数据的除法和取余运算很简单,非常的直观
-
17 / 0
:会抛出java.lang.ArithmeticException 异常 -
0 / 0
:会抛出java.lang.ArithmeticException 异常 -
0 % 17
:等于 0 -
17 % 0
:会抛出java.lang.ArithmeticException 异常,因为取余就相当于先进行了除数运算,再拿到余数作为计算结果
对于实型数据
实型数据可就复杂了哦,但是实型数据除了一个正无穷一个负无穷的情况,其他都是 NaN,好记的很啊!NaN 全称是 not a number ,源码中是如下定义的:public static final double NaN = 0.0d / 0.0;
-
17.0 / 0
:返回结果为 Infinity,正无穷 -
-17.0 / 0
:等于 -Infinity,负无穷 -
0 / 0.0
:返回结果为 NaN -
0.0 % 0
:返回结果为 NaN -
17.6 % 4
:整数取余,再加上剩下的小数
运算符中的 +
作为算数运算符的加法
byte、short、char 这三种数据类型在参与运算的时候,可能会被自动转换为 int 类型的数据参与运算,具体规则如下:
- 单目运算不会改变类型,
j++
- 复合双目运算不会改变类型,
j+=1
- 双目运算会改变类型,
j = j + 1
作为字符串连接符
String s = "hello" + "world"
,这时候,体现的是作为字符连接符的作用。在方法区的常量区开辟内存空间!
循环结构
循环结构中有一个特例,即使用 break / continue 和 label 标签配合使用来结束循环代码块。单独使用 break 只能跳出本层循环,但配合使用标签可以跳出更外层的循环。是跳出标签指定范围内的这个代码块,光标直接跳到这个代码块的结束位置。这种方式更灵活,代码可读性也高。
public static void main(String[] args) {
label1:
while (true) {
label2:
for (int i = 0; i <= 10; i++) {
System.out.println("i=" + i);
if (i == 5) {
// 跳出 label1 标签指定的代码块结束位置
break label1;
}
}
System.out.println("++++++++++++++");
}
}