(1)两个int类型相除结果还是 int, 需要使用 double 来计算,如下代码所示:
int m = 6;
int n = 4;
System.out.println(m/n);//运行结果为1
(2)0不能作为除数,如果0作为除数则会出现算数异常,如下所示:
int m = 2;
int n = 0;
System.out.println(m/n);
运行结果:
(3)% 表示取余, 可以对int和double求模。
System.out.println(6 % 4);
System.out.println(6.3 % 2.1);
int m = 1, n = 2, o = 3, p = 4, q = 5;
m += m;//相当于m=m+m,下列同理
n -= 1;
o *= o;
p /= 4;
q %= 4;
System.out.println("m="+m+",n="+n+",o"+o+",p="+p+",q="+q);
int m = 23;
int n = m++;//m的值先赋给n,再自加一,故n的值为23,m的值为24
System.out.println(n);
System.out.println(m);
int a = ++m;//m的值先自加1再赋值给a,故a的值为25
System.out.println(a);
关系运算符主要有六个:== != < > <= >=,表达式返回值都是 boolean 类型。
int m = 23;
int n = 25;
System.out.println(m == n);//运行结果:false
System.out.println(m != n);//运行结果:true
System.out.println(m < n);//运行结果:true
System.out.println(m > n);//运行结果:false
System.out.println(m <= n);//运行结果:true
System.out.println(m >= n);//运行结果:false
逻辑运算符主要有三个:&& || !,逻辑运算符的操作数(操作数往往是关系运算符的结果)和返回值都是 boolean。
两个操作数均为true,结果为true。否则有一个操作数为fasle,则结果为false。
int m = 23;
int n = 25;
System.out.println(m != n && m < n);//m!=n结果为true,m
System.out.println(m == n && m > n);//同理,运行结果:false
两个操作数均为false,结果为false。否则有一个操作数为true,结果为true。
如下列代码:
运行结果:
顾名思义,操作数为 true, 则结果为 false,反之亦然(这是个单目运算符, 只有一个操作数)
int m = 23;
int n = 25;
System.out.println(! (m != n));//m!=n的结果为true,取非,则最终结果为false
(1)&& 和 || 遵守短路求值的规则
System.out.println(23 > 25 && 23 / 0 == 9);//运行结果:false
System.out.println(23 < 25 || 23 / 0 == 5);//运行结果:true
如上代码,程序正常运行,我们知道在计算23 / 0会导致程序抛出异常,但上述代码却没有,说明23 / 0没有被求值。
如上,对于逻辑与&&,如果左侧表达式值为 false, 无需计算右侧表达式,则表达式的整体值是 false,。
对于逻辑或 ||, 如果左侧表达式值为 true, 无需计算右侧表达式,则表达式的整体值是 true。
(2)& 和 | 不支持短路求值(不推荐使用)
& 和 | 如果操作数为 boolean 的时候,也表示逻辑运算。
System.out.println(23 > 25 & 23 / 0 == 9);
System.out.println(23 < 25 | 23 / 0 == 5);
Java 中对数据的操作最小单位不是字节, 而是二进制位。位操作符有四个:& | ~ ^。
位操作表示按二进制位运算。计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位的每一位依次进行计算。
如果两个二进制位都是 1,则结果为 1,否则结果为 0。进行按位运算, 需要先把 15 和 8 转成二进制, 分别为 1111和 1000。
int m = 15;
int n = 8;
System.out.println(m & n);//运行结果8
如果两个二进制位都是 0, 则结果为 0, 否则结果为 1。
int m = 13;
int n = 2;
System.out.println(m | n);//运行结果为15
当 & 和 | 的操作数为整数(int, short, long, byte) 的时候, 表示按位运算, 当操作数为 boolean 的时候, 表示逻辑运算。
如果该位为 0 则转为 1, 如果该位为 1 则转为 0。
int m = 0x1;
System.out.printf("%x\n", ~m);//运行结果:fffffffe
结论:
如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1。
如下列代码所示:
int m = 0x2;
int n = 0x6;
System.out.printf("%x\n", m ^ n);
移位运算符有三个:<< >> >>>,都是按照二进制位来运算。
左移时,不分正负数,最左侧位不要, 最右侧补 0。并且移动位数超过该类型的最大位数会进行取模,如对Int型左移33位,实际上只移动1位。左移n位相当于乘以2的n次方。如下列代码,左移4位相当于乘以2的4次方:
int m = 1;
System.out.printf("%d\n", m << 4);//运行结果是16
右移时,最右侧位不要, 最左侧补符号位,如果该数为正,则高位补0,若为负数,则高位补1。右移 N 位, 相当于原数字除以2 的N次方。如下列代码所示:
int m = 0x18;
System.out.printf("%x\n",m >>1);//运行结果是c(十六进制输出)
最右侧位不要, 最左侧补 0
int m = 0xffffffff;
System.out.printf("%x\n", m >>> 3);//运行结果是1fffffff(十六进制输出)
注:由于计算机的计算移位效率高于计算乘除,当某个代码正好乘除 2 的N次方时可以用移位运算代替,并且移动负数位或者移位位数过大都没有意义。
基本格式:
表达式1 ? 表达式2 : 表达式3
当表达式1 的值为 true , 整个表达式的值为表达式2的值;当表达式1的值为 false 时, 整个表达式的值为 表达式3 的值。它是 Java 中唯一的一个 三目运算符, 是条件判断语句的简化写法。
// 比较两个数的大小
int m = 23;
int n = 25;
int count = m > n ? m : n;
System.out.println(count);//运行结果是25