运算符
算术运算符:
+ 加
- 减
* 乘积
/ 除,商
% 取余(取模)
++
–
重点:++
++无论出现在变量前还是变量后,只要 ++ 运算结束,一定会自加 1。
int i = 10;
i++;
System.out.println(i); // 11
int k = 10;
++k;
System.out.println(k); // 11
++出现在变量前:先运算再赋值
int i = 10;
int k = ++i;
System.out.println(k); // 11
System.out.println(i); // 11
++出现在变量后:先赋值再运算
int i = 10;
int k = i++;
System.out.println(k); // 10
System.out.println(i); // 11
int i = 10;
System.out.println(i++); // 10
解开以上题目的窍门是什么?拆代码
int temp = i++;
System.out.println(temp); // 10
System.out.println(i); // 11
int i = 10;
System.out.println(++i); // 11
会拆代码:
int temp = ++i;
System.out.println(temp); // 11
System.out.println(i); // 11
例:
public static void main(String[] args) {
int i = 10;
System.out.println(i++); // 10
}
public static void main(String[] args) {
int i = 10;
i++;
System.out.println(i); // 11
}
public static void main(String[] args) {
int m = 20;
int n = m++;
System.out.println(n); // 20;
System.out.println(m); // 21
int x = 100;
int y = ++x;
System.out.println(x); // 101
System.out.println(y); // 101
int o = 20;
o++;
System.out.println(o); // 21
int p = 20;
System.out.println(p++); // 20
System.out.println§; // 21
/**
* 控制台显示:
* 20
* 21
* 101
* 101
* 21
* 20
* 21
*/
}
关系运算符:
>
>=
<
<=
==
!=
结果都是布尔类型。true/false
规则:所有的关系运算符的运算结果都是布尔类型,不是 true 就是 false,不可能其他值。
在java语言中:
= :赋值运算符
== :关系运算符,判断是否相等。
注意:关系运算符中如果有两个符号的话,两个符号之间不能有空格。
逻辑运算符:
& 逻辑与(可以翻译成 并且)
| 逻辑或(可以翻译成 或者)
! 逻辑非(取反)
&& 短路与
|| 短路或
逻辑运算符两边要求都是布尔类型,并且最终的运算结果也是布尔类型。这是逻辑运算符的特点。
逻辑运算符要求两边都是布尔类型,并且最终结果还是布尔类型。
左边是布尔类型 & 右边还是布尔类型 -->最终结果还是布尔类型。
& 两边都是 true,结果才是 true
| 一边是 true, 结果就是 true
! 取反
&& 实际上和 & 运算结果完全相同,区别在于:&& 有短路现象。
左边的为 false 的时候:&&短路了。
左边为 true 的时候: || 短路了
对于逻辑与&运算符来说,只要有一边是false,结果就是false。只有两边同时为true,结果才是true。
对于逻辑或呢?
只要有一边是true,结果就是true。
& 两边都是 true,结果才是 true
| 有一边是 true,结果就是 true
短路与 && 和 逻辑与&有什么区别?
首先这两个运算符的运算结果没有任何区别,完全相同。只不过“短路与&&”会发生短路现象。
什么是短路现象呢?
右边表达式不执行,这种现象叫做短路现象。
什么时候使用 &&,什么时候使用 &?
从效率方面来说,&& 比 & 的效率高一些。
因为 逻辑与& 不管第一个表达式结果是什么,第二个表达式一定会执行。
//什么是短路现象,什么时候会发生“短路”。
int x = 10;
int y = 11;
System.out.println(x > y & x > y++);
// 通过这个测试得出:x > y++ 这个表达式执行了。
System.out.println(y); // 12
// 测试短路与&&
int m = 10;
int n = 11;
// 使用短路与&&的时候,当左边的表达式为false的时候,右边的表达式不执行,这种现象被称为短路。
System.out.println(m > n && m > n++);
System.out.println(n); // 11
什么时候发生短路或现象?
|| 短路或
“或”的时候只要有一边是true,结果就是true。
所以,当左边的表达式结果是true的时候,右边的表达式不需要执行,此时会短路。
+=
-=
*=
/=
%=
除 = 之外。+=, -=, *= , /=, %=都是扩展运算符
重要规则:
扩展赋值运算符在使用的时候要注意,不管怎么运算,最终的运算结果类型不会变。
byte x = 100; // byte最大值127
x += 1000; // 编译可以通过,x变量还是 byte 类型,只不过损失精度了。
x += 1000; 等同于:x = byte(x + 10000);
1、赋值运算符包括“基本赋值运算符”和“扩展赋值运算符”:基本的、扩展的。
2、基本赋值运算符?
=
3、扩展的赋值运算符?
+=
-=
*=
/=
%=
注意:扩展赋值运算符在编写的时候,两个符号之间不能有空格。
4、语法机制:
使用扩展赋值运算符的时候,永远都不会改变运算结果类型。
赋值运算符“=”右边优先级比较高,先执行右边的表达式,
然后将表达式执行结束的结果放到左边的“盒子”当中。(赋值)
i += 10; 和 i = i + 10; 只能说相似,其实本质上并不是完全相同。
byte x = 100;
System.out.println(x); // 100
// 编译报错,不兼容类型:从int转换到byte可能会有损失
x = x + 1; // 编译器检测到 x + 1 是int类型,x 是byte类型,1 是 int 类型,所以是 int 类型
// x 自诞生以来是 byte 类型,那么 x 变量的类型永远都是 byte。不会变。不管后面是多大的数字。
// x += 1 等同于:x = (byte)(x + 1);
x += 1; // 编译通过,运算结果类型不会改变
条件运算符
三目运算符:布尔表示 ? 表达式1 : 表达式2
布尔表达式为 true,选择表达式 1 作为结果。反之选择表达式 2 作为结果。
语法格式:
布尔表达式 ? 表达式1 : 表达式2
执行原理是什么?
布尔表达式的结果为 true 时,表达式 1 的执行结果作为整个表达式的结果。
布尔表达式的结果为 false 时,表达式 2 的执行结果作为整个表达式的结果。
boolean sex = false;
sex ? ‘男’ : ‘女’; // 得出结果为 ‘女’; ,不是语句。‘女’; 不是语句
char c = sex ? ‘男’ : ‘女’; // 编译通过
字符串连接运算符
+
+ 两边都是数字,进行求和运算。
+ 有一边是字符串,进行字符串的拼接。
+ 有多个的话,遵循自左向右依次执行:1 + 2 + 3
如果想让其中某个加号先执行,可以添加小括号
注意:字符串拼接之后的结果还是一个字符串。
最好的代码是:最少的代码量,最高的效率