- 运算符
第四章 运算符
运算符介绍
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
运算符有算数运算符、赋值运算符、关系运算符、逻辑运算符、位运算符和三元运算符。
★算数运算符
算数运算符是对数值类型的变量进行运算的。
运算符 运算 范例 结果 + 正号 +7 7 - 负号 b = 11; -b -11 + 加 9 + 9 18 - 减 10 - 8 2 * 乘 7 * 8 56 / 除 9 / 9 1 % 取余 11 % 9 2 ++ 自增 a = 2; a++ 或 ++a a = 3 – 自减 a = 2; a– 或 –a a = 1 + 字符串相加 “C” + “S” CS (注意:a++ 是先取值后运算,++a 是先运算后取值)
★(注意:在 Java 中,a % b = a - a / b * b;
当 a 是小数时,a % b = a - (int) a / b * b)
1
2
3
4
5
6
7
8
9
10public class Test{
public static void main(String[] args){
//在 Java 中,a % b = a - a / b * b
System.out.println(10 % 3); //结果为 1 ——> 10 - 10 / 3 * 3 = 1
System.out.println((-10) % 3); //结果为 -1 ——> -10 - (-10) / 3 * 3 = -1
System.out.println(10 % (-3)); //结果为 1 ——> 10 - 10 / (-3) * (-3) = 1
System.out.println((-10) % (-3)); //结果为 -1 ——> -10 - (-10) / (-3) * (-3) = -1
System.out.println((-11) % 3); //结果为 -2 ——> -11 - (-11) / 3 * 3 = -2
}
}★经典面试题:
1
2
3
4
5
6
7
8
9
10
11public class Test{
public static void main(String[] args){
int i = 1;
i = i++ ; //规则:使用临时变量。(1) temp = i(这里的i是等号右边的i);(2) i = i + 1;(3) i = temp(这里的i是等号左边的i)。
System.out.println(i); //结果为 1
int j = 1;
j = ++j ; //规则:使用临时变量。(1) j = j + 1;(2) temp = j(这里的j是等号右边的j);(3) j = temp(这里的j是等号左边的j)。
System.out.println(j); //结果为 2
}
}
关系运算符(比较运算符)
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
== | 相等于 | 8 == 7 | false |
!= | 不等于 | 8 != 7 | true |
< | 小于 | 8 < 7 | false |
> | 大于 | 8 > 7 | true |
<= | 小于等于 | 8 <= 7 | false |
>= | 大于等于 | 8 >= 7 | true |
instanceof | 判断对象的运行类型是否为XX类型或XX类型的子类型 | “Alex” instanceof String | true |
1 | // Sub 是 Base 的子类 |
注意:
子类对象 instanceof 父类 == true
父类对象 instanceof 子类 == false
逻辑运算符
- 用于连接多个关系表达式,最终结果是一个 boolean 类型的值,即 true 或 false。
- 短路与 &&、短路或 ||和取反 !
- 短路与 && :两个条件都为 true ,结果才为 true;
- 短路或 ||:两个条件只要有一个为 true,结果就是 true;
- 取反 !:如果条件本身成立,则结果为 false,否则为 true。
- 逻辑与&、逻辑或|、逻辑异或 ^
- 逻辑与 &:两个条件都为 true ,结果才为 true;
- 逻辑或 |:两个条件只要有一个为 true,结果就是 true;
- 逻辑异或 ^ :a ^ b ,当 a 和 b 不同时,结果为 true ,否则为 false。
(4 < 1) ^ (2 > 1) ——> true
▲(注意:&& 与 & 的区别:对 && 而言,如果第一个条件为 false ,则第二个条件不会判断,最终结果为 false,效率高;
对 & 而言,不管第一个条件是否为 false ,第二个条件都要判断,效率低 。开发中基本用 &&)
▲(注意:|| 与 | 的区别:对 || 而言,如果第一个条件为 true ,则第二个条件不会判断,最终结果为 true,效率高;
对 | 而言,不管第一个条件是否为 true ,第二个条件都要判断,效率低 。开发中基本用 ||)
1 | public class Test{ |
赋值运算符
赋值运算符就是将某个运算后的值,赋给指定的变量。
- 基本赋值运算符:=
- 复合赋值运算符:+=、-=、*=、/=、%=
赋值运算符特点
运算顺序从右往左;
赋值运算符的左边只能是变量,右边可以是变量、表达式、常量值;
复合赋值运算符等价于下面的效果:
a += 1 + 2 ——> a = a + (1 + 2)
;复合赋值运算符会进行类型转换,
byte b = 2; b += 3; b++; ——> 此时 b = 6 ,且为 byte类型
。★(注意:b += 3,其实等价于 b = (byte)(b + 3),底层会对这个结果进行强转的,所以它编译的时候没事,但是如果是
b = b + 3,则会编译错误,因为 3 默认是 int 型,相当于结果是 int 类型,赋给 byte 类型变量会报错)
三目运算符
基本语法:条件表达式 ? 表达式1 : 表达式2
如果条件表达式结果为 true ,则运算表达式1,反之运算表达式2。
使用细节
表达式1 和表达式2 要为可以赋给接收变量的类型(或可以自动转换);
三目运算符可以转为 if - else 语句。
三目运算符是一个整体,要求表达式1和表达式2类型一致,所以最后的结果类型会自动升到精度最高的那种类型。
1
2
3
4
5
6public class Test {
public static void main(String[] args) {
Object obj1 = true ? new Integer(1) : new Double(2);
System.out.println(obj1); //输出结果为 1.0
}
}
运算符优先级
- 只有单目运算符、赋值运算符是从右向左运算的;
- ()、{}、. 、, 等 —> 单目运算符 —> 算数运算符 —> 位移运算符 —> 比较运算符 —> 逻辑运算符 —> 三目运算符 —> 赋值运算符。
★标识符的命名规则和规范
规则
- 由 26 个英文字母大小写,0-9,_ 或 $ 组成;
- 数字不可以开头;
- 不可以使用关键字和保留字,但能包含关键字和保留字;
- 严格区分大小写;
- 标识符不能包含空格。
规范
- 包名:多单词组成时所有字母都小写:aaa.bbb.ccc ;
- 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz; —> 大驼峰命名方式
- 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz;—> (小)驼峰命名方式
- 常量名:所有字母都大写,多单词时每个单词用下划线连接:XXX_YYY_ZZZ。
进制
- 二进制:0,1。满 2 进 1,以 0b 或 0B 开头:0b1010 —> 10;
- 十进制:0 - 9。满 10 进 1。
- 八进制:0 - 7。满 8 进 1,以数字 0 开头表示:010 —> 8;
- 十六进制:0 - 9 及 ABCDEF(此处的 A - F 不区分大小写),满16进1,以 0x 或 0X 开头:0x1010 —> 4112。
位运算符
运算符 | 含义 |
---|---|
按位与 & | 两个全为 1 ,结果为 1 ,否则为 0 |
按位或 | | 两个有一个为 1 ,结果为 1 ,否则为 0 |
按位异或 ^ | 两个一个为 1 ,一个为 0,结果为 1 ,否则为 0 |
按位取反 ~ | 0 -> 1,1 -> 0 |
算数右移 >> | 低位溢出,符号位不变,并用符号位补溢出的高位 |
算术左移 << | 符号位不变,低位补0 |
逻辑右移 >>> | 低位溢出,高位补0 |
(★注意:在计算机进行位运算的时候,都是以补码的方式来运算的!)
1 | public class Test{ |