六、Java-----运算符
(一)算数运算符
算术运算符也称基本运算符,为加减乘除模(+ - * / %)。
“+”:
int sum1 = 10 + 20; // 输出sum1 = 30
除了常见的加法运算,加号也可用于字符串拼接。
String str1 = 123 + "123"; // 输出字符串123123
“-”、“*”:
正常运算,没啥特殊的。
“/”:
System.out.println(5/2);//2
System.out.println((float)5/2);//2.5
System.out.println(5/(float)2);//2.5
System.out.println((float)(5/2));//2.0
5/2,int型/int型,整数除法会截断小数,答案是2;
(float)5/2,int型的2自动提升为float型,答案是2.5;
5/(float)2同上;
(float)(5/2),5/2为int型的2,2强制转换为float型,答案是2.0
“%”:取余,相当于数学运算中除法的余数。
System.out.println(10 % 3);//1
System.out.println(10 % -3);//1
System.out.println(-10 % 3);//-1
System.out.println(-10 % -3);//-1
System.out.println(11.5 % 2);//1.5
注意:
①基本运算符都是二元运算符,使用时必须保证运算符左右都有操作数。
②除法和取模运算,右操作数不能为0。
③两侧操作数类型不一致时,向范围大的类型提升。
(二)自增/自减运算符
“++”、“--”:
分为前置++(前置--)和后置++(后置--)。
就“++”举例:
1.单独使用时,前置++和后置++没有区别。
int a = 10;
a++;
System.out.println(a);//a = 11
int a = 10;
++a;
System.out.println(a);//a = 11
2.混合使用时,前置++:先+1再使用;后置++:先使用,再+1
int a = 1;
int b = a++;
System.out.println(b);//注意:后置++是先使用变量原来值,表示式结束时给变量+1,故输出b=1
System.out.println(a); // 输出2
int c = ++a;
System.out.println(c); // 注意:前置++是先给变量+1,然后使用变量中的值,因此输出3
System.out.println(a); // 输出3
可以打断点在控制台调试观察a的值。
(三)赋值运算符
1.简单赋值:=
2.复合赋值:-=、+=、*=、/=、%=
int a = 1;
a += 2; // 相当于 a = a + 2
System.out.println(a); // 输出3
a -= 1; // 相当于 a = a - 1
System.out.println(a); // 输出2
a *= 3; // 相当于 a = a * 3
System.out.println(a); // 输出6
a /= 3; // 相当于 a = a / 3
System.out.println(a); // 输出2
a %= 3; // 相当于 a = a % 2
System.out.println(a); // 输出2
注意:
①赋值运算符操作完成后,会将结果赋值给左操作数。
②赋值运算符会帮助用户进行强制类型转换。
例:
long d = 100;
int c = 9;
c += d;//等价于c = (int)(c + d);
System.out.println(c);//109
(四)关系运算符
主要有六个:==、!=、<、>、<=、>=,计算结果是true或者false。
int a = 10;
int b = 20;
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a < b); // true
System.out.println(a > b); // false
System.out.println(a <= b); // true
System.out.println(a >= b); // false
注意:
①在Java中,= 表示赋值,与数学中含义区分。
②在Java中,== 表示相等。
③在Java中,当需要多次判断时,不能连写。比如:2 int x = 5; System.out.println(2 原因是,当编译器编译到2 (五)逻辑运算符 基本逻辑运算符:(运算结果都是boolean类型) 1. &&(逻辑与 / 短路与): 两个表达式结果都为真,结果才为真;只要有一个是假,结果便为假。 布尔表达式1布尔表达式2结果真真真真假假假真假假假假 语法规则: ①形式为:布尔表达式1 && 布尔表达式2 ②左右表达式结果必须是boolean类型。 ③符合短路求值的规则:如果左侧表达式值为false,结果一定是false,右侧表达式不需计算。 例: int a = 1; int b = 2; System.out.println(a == 1 && b == 2); // 左真 且 右真 则结果为真 System.out.println(a == 1 && b > 100); // 左真 但 右假 则结果为假 System.out.println(a > 100 && b == 2); // 左假(,但右为真) 则结果为假 System.out.println(a > 100 && b > 100); // 左假(,且右为假) 则结果为假 2. | | (逻辑或 / 短路或): 两个表达式只要有一个为真,结果就为真。 布尔表达式1布尔表达式2结果真真真真假真假真真假假假 语法规则: ①形式为:布尔表达式1 || 布尔表达式2 ②左右表达式结果必须是boolean类型。 ③符合短路求值的规则:如果左侧表达式值为true,结果一定是true,右侧表达式不需计算。 例: int a = 1; int b = 2; System.out.println(a == 1 || b == 2); // 左真 且 右真 则结果为真 System.out.println(a == 1 || b > 100); // 左真 但 右假 则结果为真 System.out.println(a > 100 || b == 2); // 左为假(,但右为真) 则结果为真 System.out.println(a > 100 || b > 100); // 左为假(,且右为假) 则结果为假 3. !(逻辑非 / 非): 真变假,假变真。 布尔表达式真假假真 语法规则: ①形式为:!布尔表达式 ②结果是boolean类型 例: int a = 1; System.out.println(!(a == 1)); // a == 1 为true,取非就是false System.out.println(!(a != 1)); // a != 1 为false,取非就是true 非短路版本: &(按位与)和 |(按位或)当表达式结果为boolean类型时,也表示逻辑运算,但无短路特性。 (六)位运算符 位运算符主要有四个:&、|、~、^。除了~是一元运算符,其它的都是二元运算符。 位操作表示按二进制位运算。按位运算就是按照二进制位的每一位依次进行计算。 1. &(按位与): 如果两个二进制位都是1,则结果为1,否则为0。(全1则1) 例: int a = 10;//0000 1010 int b = 20;//0001 0100 System.out.println(a & b);//0000 0000 进行按位与运算,首先将10,20转换成二进制形式,分别为00001010,00010100,按位相与得出结果为00000000,故控制台输出结果为0。 2.|(按位或): 如果两个二进制位都是0,则结果为0,否则为1。(全0则0,有1则1) 运算方式与按位与类似。例: int a = 10;//0000 1010 int b = 20;//0001 0100 System.out.println(a | b);//0001 1110 注意: 当&、|的操作数为整数,即int型、short型、long型、byte型,表示按位运算,当操作数为boolean型时,表示逻辑运算。 3. ~(按位取反): 如果该位为0,则取反为1,如果该位为1,则取反为0。 4. ^(按位异或): 如果两个数字的二进制位相同,则结果为0,不同则结果为1。(相同为0,不同为1) (七)三元运算符 三元运算符也叫条件运算符,Java中只有一个: 表达式1 ?表达式2 :表达式3 意为: 当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值; 当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值。 博主碎碎念: 博主本人的记忆方式是偏口语化的: “表达式1为真吗?真就返回表达式2的值,假就返回表达式3的值。” 例如: // 求两个整数的最大值 int a = 10; int b = 20; int max = a > b ? a : b; a>b吗?大于就返回a,不大于就返回b ) 注意: ①三元运算符是条件判断语句的简化写法。 ②表达式不能单独存在,其产生的结果必须要被使用。 例如: int a = 10; int b = 20; a > b? a : b; // 值没有使用,会报错 (八)优先级 运算符之间存在优先级,但无需特别记忆,在可能存在计算顺序歧义的代码部分直接加括号。