本篇文章将会对Java语言中的计算规则进行总结,内容包括:
算术运算符
在Java中加、减、乘的运算符号分别是+ 、- 、 *,其运算结果与实际生活中数学计算的结果一致,但是对于除法计算,在计算机中存在较大的差异。
在java中不存在除法运算符,只存在取模运算(/)和取余运算(%),取模运算就是取整运算,取余运算将会得到余数:
1 | System.out.println(5/2);//将会输出2 |
在java中“=”,是赋值的意思(将右边的值赋给左边的变量),而非判断两个数值是否相等(在java中判断是否相等用“==”)。
在Java中也存在着一些“简写”形式的表达式子。比如:如果表达式为x = x+4;可以写成x+=4.(同样的有+=、-=、=、%=等);表达是i++(或i–)表示i自增(自减)1,需要注意的是,这种写法表示的是先使用i的值,使用完之后i再自增(自减)1,而++i(–i)表示的是先将i的是进行自增(自减)1,再使用i的值。
数学函数
对于需要进行的诸如幂运算、开方、取对数等数学运算,Java中Math类来提供了各种各样的额数学运算,例如:求平方根的sqrt(),幂运算的pow等。使用math类可以通过两种方式,一种是直接使用,如:Math.sqrt(),也可以在程序中引入math类,再程序的开始处加上“import static java.lang.Math.*;”即可,之后再使用sqrt函数直接写即可。
再math类中还提供了一种“特殊”的取模运算。再java程序中如果直接使用/进行取模,如果计算的被除数是一个负数,那么得到的结果也将会是一个负数。比如-5/2将会得到的是-2而不是日常数学计算中的2,math类中提供了floorMod方法可以将这种情况下的计算结果取正,但是对于除数是负数的情况,也将无能为力。
类型转换
在java中有两种情况将会发生类型转换。
一种是当二元运算符(如+)连接的两个数值中类型不同时,则计算结果的类型将会转换为两者中精度更高的类型,比如float%int类型,其计算结果将会是float类型。
另外一种情况就是进行强制类型转换时,例如int i = (int)n;那么无论n的数值是一个什么类型都会被转换为int类型。
java中将浮点数转换为整数时,该方式将直接将小数部分截断,例如2.6转换为int类型的结果是2。math类中的round方法进行类型转换时将取一个最接近的数。如9.8将会转换为10但是9.1将会转换为9。
在进行类型转换的过程有些类型之间的转换将会产生信息损失,有些则不会。下图展现的就是在二元运算符中发生类型转换时的情形。

最后一种发生的比较隐蔽。对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过范围,javac编译器将会自动的为我们加上(byte)(short))(char),这也是为什么我们在对char类型整形值时有时不会报错的原因,比如:char c = 65;进行打印输出时会打印处A。但是对于如下的一段代码将会进行报错:
1 | short a = 10; |
发生这种现象的原因时有与java中编译器的常量优化造成的。在Java中,在给变量赋值时,如果等号右侧的表达式中全部都是常量,没有任何变量时,编译器将javac将会直接计算出结果,而不是等到运行程序时再进行计算。
1 | short result = 10+20;//编译器将会直接将result的值设定为30,而不是等运行的时候再进行计算 |
但是如果在等号的有变量存在,则不会进行这种优化
1 | short result = a + 20//结果将会报错,因为a时一个short类型的变量,20默认时int型,则结过因该时一个整型。但是这里的resul时一个short类型,所以会报错 |
这时候就需要进行程序员进行以下强制转换:
1 | short result = (short)(a + 20);//结果会被强制转换为short类型,不会报错 |
Java这么做的原因时,java的设计者认为,类似于10+20这样的计算,它的结果时确定的,不会变的,所以不如在编译的之后就直接算出来,这样就不要再在程序运行的时候取浪费计算机的资源进行计算了,但是如果有变量存在,例如:a + 20,它的结果是由a的值决定的,但是a时一个变量,其值是可能发生变化的,所以在编译的时候不能进行计算,必须等到运行的时候才能进行计算。
关系运算
java中存在以下几种位运算:
- ==或!=(> 、<、>=、<=也类似):判断两个值是都相等或不相等,是则返回true,否则返回false
- 与:A&&B:两者中有一个为false则表达式为false;如果A已经判断为false则B将不会进行计算
- 或:A||B:两者中有一个为true则表达式结果为true;如果A已经判断为true则B将不会进行计算
- 非!:取反,false变true,true变false
- 三目运算符:condition?expression1:expression2:如果condition为真则用expression1,否者用expression2
位运算
java中存在以下几种位运算: - 非 ~:将二进制的1变为0,0变为1
- 按位或|:两个操作数其中一个是1时就是1
- 按位与&:两个操作数都是1时才是1
- 异或:java中没有同或从高位开始比较,如果相同则为0,不相同则为1。(java中没有同或)
- 右移 A< < X:将操作数A按二进制向右移x位
- 左移:A>>X:将操作数A按二进制向左移x位
- 无符号右移:A>>>x:将操作数A按二进制向右移x位,并用零填充最高位。
示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15int i = 10;
int j,k,p,q,s,d,f;
j = 10 | 0b1100;
k = 10 & 0b1100;
p = ~10;
q = 10 << 3;
s = 10 >> 3;
d = -10>>>1;
System.out.println("i = " + Integer.toBinaryString(i));//1010
System.out.println("j = " +Integer.toBinaryString(j));//1110
System.out.println("k = " +Integer.toBinaryString(k));//1000
System.out.println("p = " +Integer.toBinaryString(p));//11111111111111111111111111110101
System.out.println("q = " +Integer.toBinaryString(q));//1010000
System.out.println("s = " +Integer.toBinaryString(s));//1
System.out.println("d = " +Integer.toBinaryString(d));//1111111111111111111111111111011运算的优先级
如果使用圆括号,则按照运算符的优先级进行运算。同一级别的运算符将会按照从左到右的次序进行计算(一些右结合的运算符除外),例如a&&b||c就相当于(a&&b)||c,具体运算符优先级见下图:
本文链接: https://quandongli.github.io/post/e0ba64a3.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
