基本四则运算:加减乘除求模(+,-,*,/,%),规则比较简单。
注意:
int / int 结果还是 int 类型
int a = 1;
int b = 2;
System.out.println(a / b); // 结果为 0,结果本应该是0.5,但因为结果应该为 int 类型,所以只取整数部分。
//若要得到正确结果,应使得结果为 double 类型
double d = a * 1.0 / b;
System.out.println(d);// 1.5
0 不能作为除数
int a = 1;
int b = 0;
System.out.println(a / b);
会报以下错误:
% 表示取余,不仅可以对 int 求模,也能对 double 求模
System.out.println(11.5 % 2.0);//结果为 1.5
增量赋值运算符 +=、-=、*=、/=、%=
int a = 10;
a += 1; // 等价于 a = a + 1
System.out.println(a);
自增/自减运算符 ++、–
自增(++)和自减(–)运算符是对变量在原始值的基础上进行加1或减1的操作。它们都有前缀和后缀两种形式。前缀形式(++a)的运算规则可以概括为:”先自增,后用”,而后缀形式(a++)的运算规则可以概括为:”先用,后自增”。
示例1:
int a = 10;
int b = ++a; // a先加1,再把值赋值给b
System.out.println(b);
int c = 10;
int d = c++; // c先把值赋值给d,c再加1
System.out.println(d);
示例2:
int a = 10;
System.out.println(a++);
int b = 10;
System.out.println(++b);
关系远算符有6个:(==
,!=
,>
,<
,>=
,<=
),其结果是true
和flase
示例:
int a = 10;
int b = 20;
System.out.println(a == b);
System.out.println(a != b);
System.out.println(a < b);
System.out.println(a > b);
System.out.println(a <= b);
System.out.println(a >= b);
结果:
注意:关系运算符的表达式的返回值都是 boolean 类型的。
逻辑远算符主要由3个:(&&
,||
,!
),运算结果都是 boolean
类型。
逻辑与运算,运算规则:全一为一,有零为零。即只有两个操作数都为1
时,结果才为1
,其他情况均为0
(也可以说,只要有0
,结果就为0
)。
在Java中,规则: 两个操作数都为 true, 结果为 true, 否则结果为 false,计算规则同上。(注意:两个操作数必须都为 boolean 类型的)
int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b && b < c);//结果为 true
逻辑或运算,运算规则:全零为零,有一为一。即只有两个操作数都为0
时,结果才为0
,其他情况均为1
(也可以说,只要有1
,结果就为1
)。
在Java中,规则: 两个操作数都为 false, 结果为 false, 否则结果为 true,计算规则同上。(注意:两个操作数必须都为 boolean 类型的)
int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b || b < c);//结果为 true
在Java中,规则: 操作数为 true, 结果为 false; 操作数为 false, 结果为 true(这是个单目运算符, 只有一个操作数),计算规则同上。(注意:两个操作数必须都为 boolean 类型的)
int a = 10;
int b = 20;
System.out.println(!(a < b));//结果为 false
Java 中数据存储的最小单位是字节,而数据操作的最小单位是比特位. 字节是最小的存储单位,每个字节是由8个二进制比特位组成的,多个字节组合在一起可以表示各种不同的数据。
位运算符主要有四个:
& | ~ ^
位操作表示 按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位的每一位依次进行计算。
如果两个二进制位都是 1, 则结果为 1, 否则结果为 0。
int a = 10;// 01010
int b = 20;// 10100
System.out.println(a&b);// 00000
如果两个二进制位都是 0, 则结果为 0, 否则结果为 1。
int a = 10;// 01010
int b = 20;// 10100
System.out.println(a|b);// 11110
注意 :当 & 和 | 的操作数为整数(int, short, long, byte) 的时候, 表示按位运算, 当操作数为 boolean 的时候, 表示逻辑运算
如果该位为 0 则转为 1, 如果该位为 1 则转为 0。
int a = 0xf;
System.out.printf("%x\n",~a);
System.out.println(a);
注意:
0x 前缀的数字为 十六进制 数字. 十六进制可以看成是二进制的简化表示方式. 一个十六进制数字对应 4 个二进制位
0xf 表示 10 进制的 15, 也就是二进制的 1111
printf 能够格式化输出内容, %x 表示按照十六进制输出
\n 表示换行符
如果两个数字的二进制位相同,则结果为1,相异则结果为0
int a = 0x1; // 0001
int b = 0x2; // 0010
System.out.printf("%x",a^b); // 0011
移位运算有三个:<< >> >>>
,都是按照二进制位来运算的
int a = 0x10;
System.out.println(a);
System.out.printf("十六进制表示:%x\n",a << 1);
System.out.println("十进制表示:" + (a<<1));
注意:左移相当于乘2
int a = 0x20;
System.out.println(a);
System.out.printf("十六进制:%x\n",a>>1);
System.out.println("十进制:"+(a>>1));
int b = 0xffff0000;
System.out.println(b);
System.out.printf("十六进制:%x\n",b>>1);
System.out.println("十进制:"+(b>>1));
注意:左移相当于除2
int a = 0xffffffff;
System.out.printf("%x\n",a);
System.out.println(a);
System.out.printf("十六进制:%x\n", a>>>1);
System.out.println("十进制:"+(a>>>1));
注意:
左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.
右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.
由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替.
移动负数位或者移位位数过大都没有意义
条件运算符只有一个:表达式1 ? 表达式2 :表达式3
当表达式1
的值为 true 时,整个表达式的值为 表达式2
的值;当表达式1
的值为 false时,整个表达式的值为 表达式3
的值
该表达式也是Java中唯一的一个 三目运算符,是条件判断语句的简化写法。
//求两个整数的最大值
int a = 10;
int b = 20;
int max = a>b?a:b;
System.out.println(max);
注意:
1.表达式2和表达式3的结果是同类型的,除非能发生类型隐式转换
int a = 10;
int b = 20;
int c = a > b? 1 : 2.0;
2.表达式不能单独存在,其结果必须要被使用。
&& 和 || 遵守短路求值的规则
System.out.println(10 > 20 && 10 / 0 == 0); // 打印 false
System.out.println(10 < 20 || 10 / 0 == 0); // 打印 true
我们都知道, 计算 10 / 0 会导致程序抛出异常. 但是上面的代码却能正常运行, 说明 10 / 0 并没有真正被求值.