计算机的最基本的用途之一就是执行数学运算,运算过程中就会用到运算符,那什么是运算符呢? 即:对操作数进行操作的符号,不同运算符操作的含义不同。
1.基本四则运算符
// + - * / %
int a = 20;
int b = 10;
System.out.println(a+b); //30
System.out.println(a-b); //10
System.out.println(a*b); //200
System.out.println(a/b); //2
System.out.println(a%b); //0 %相当与数学中求除法的余数
注:
- 都是二元运算符,使用时必须有左右俩个操作数。
- int / int 的结果还是int 并且会向下取整。
- 做除法和取模时,右操作数不能为0
- % 不仅可以对整型取模,也可以对double类型取模,但是没有意义,一般都是对整型取模。
- 俩侧操作数类型不一致时,会类型提升(向类型大的提升)
2.增量运算符
// += -= /= %=
int a = 20;
a += 10; // a = a + 10; 30
int b = 20;
b -= 10; // b = b - 10; 10
int c = 20;
c /=10; // c = c / 10; 2
int d = 20;
d %=10; // d = d % 10; 0
注: 只有变量才可以使用该类运算符,常量不能使用。
3.自增/自减运算符
// ++ --
int a = 1;
a++; // a = a + 1;
int b = 1;
++b; // b = b + 1;
int c = 1;
c--; // c = c - 1;
int d = 1;
--d; // d = d - 1;
注:
- 如果单独使用 前置++ 和 后置++ 没有任何区别
- 如果混合使用 前置++ 先+1 再使用变量+1之后的值,后置++ 先使用变量原来的值 表达式结束后再给变量+1
- 只能给变量使用,常量不能使用。
// == != < > <= >= 其运算结果只能是true或者false
int a = 20;
int b = 10;
System.out.println(a==b); // false
System.out.println(a!=b); // true
System.out.println(a<b); // false
System.out.println(a>b); // true
System.out.println(a<=b); // false
System.out.println(a>=b); // true
注: 需要多次判断时不能连着写。比如: 不能写 3 < a < 4 因写为 a > 3 && a < 4
1.逻辑与 &&(相当于且)
语法规则: 表达式1 && 表达式2 左右表达式必须是boolean类型的结果
含义:只有俩个表达式都为真,结果才为真。只要有一个表达式为假,结果就是假。
int a = 1;
int b = 2;
System.out.println(a==1 && b==2); // true
System.out.println(a>1 && b<5); // false
System.out.println(a>1 && b>5); // false
2.逻辑或 || (相当于或)
语法规则:表达式1 || 表达式2 左右表达式必须是boolean类型的结果。
含义:只有俩个表达式都为假,结果才为假。只要有一个表达式为真,结果就是真。
int a = 1;
int b = 2;
System.out.println(a>1 || b>5); // false
System.out.println(a==1 || b>5); // true
System.out.println(a>1 || b<5); // true
int a = 1;
int b = 2;
System.out.println(!(a==1)); // false
System.out.println(!(a>1)); // true
注:
- 对于&&,如果左侧表达式值为false,则表达式结果一定为false,不需要计算右侧表达式。
- 对于||, 如果左侧表达式值为true, 则表达式结果一定为true, 不需要计算右侧表达式。
Java中数据存储的最小单位是字节,而数据操作的最小单位是比特位。每个比特位存储一位二进制数字。
位操作表示按二进制位运算。
1.按位与 &
含义:如果两个二进制位都是1,则结果为1,否则结果为0;
int a = 10;
int b = 20;
System.out.println(a & b);
2.按位或 |
含义:如果两个二进制位都是0,则结果为0,否则结果为1;
int a = 10;
int b = 20;
System.out.println(a | b);
3.按位取反 ~
含义:如果该位为0,则转为1.如果该位为1,则转为0;
int a = 10;
int b = 20;
System.out.println(~a);
4.按位异或 ^
含义:如果两个数字的二进制位相同,则结果为0,否则结果为1;
int a = 10;
int b = 20;
System.out.println(a^b);
按照二进制比特位来运算的;
1.<< 左移一位
含义:左移一位,右侧补0
注:向左移时丢弃的是符号位,数字可能由整数变为负数,由负数变为整数
int a = 1;
System.out.println(a<<1);
int a = 1;
int b = -1;
System.out.println(a>>1);
System.out.println(b>>1);
int a = 1;
System.out.println(a>>>1);
注:
- 左移一位相当于原数字*2 左移N位相当于原数字*2^N
- 右移一位相当于原数字/2 右移N位相当于原数字/2^N
- 计算机中移位运算效率高于乘除运算
语法规则:表达式1 ? 表达式2 :表达式3
含义:如果表达式1结果为真,则最终结果为表达式2.如果表达式1结果为假,则最终结果为表达式3.
int a = 10;
int b = 20;
int max = (a > b) ? a : b; // max = 20
注: 条件运算符只有一个,也是Java中唯一的一个三目运算符。
在一条表达式中,各个运算符可以混合使用,但是运算符的优先级不同。有些情况下会带来很大的麻烦。表达式优先级层级较多、数量也不少,因此,我特地重新归纳整理了一次巧记版本。点击此处查看:巧记运算符优先级
注: 我们平时在写代码时如果遇到运算符优先级不确定的情况时,在有可能由歧义的代码中加括号即可。