1.3 运算符、表达式、语句、程序块 (operator, Expressions, Statements, and Blocks)
1.3.1 运算符(operator)
运算符是对运算数(变量、文字量或表达式的值)执行运算的符号。例如,+、-、*
、/分别是对2个运算数进行加法、减法、乘法和除法的运算符。Java中有许多类型的运算符:
算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
一元运算符
三元运算符
1. 算术运算符
算术运算符用于对变量和数据执行算术运算。算数运算数有5个:+、-、*
、/、%。其中%是取模(求余数)运算,即 求一个数除以另外一个数的余数。如:
int x = 5 % 3; // x = 2
double y = .5 % .3; // y = .2
和C/C++语言不同,尽管可以对浮点数执行%运算,但通常不会这样做。
2.关系运算符
关系运算符用于检查两个运算符(操作数)之间的关系。关系运算符有:< 、> 、<= 、>=、== 、!= 、instanceof。“< 、> 、<= 、> =、== 、!=分别用于判断两个运算数是否具有“小于、大于、小于等于、大于等于、相等、不等”的关系,返回结果为true或false,表示关系的真或假。例如,
int a = 3, b = 5;
System.out.println(a < b); // true
System.out.println(a > b); // false
System.out.println(a >= b); // false
System.out.println(a <= b); // true
System.out.println(a == b); // false
System.out.println(a != b); // true
instanceof用于测试一个对象是否是指定类型(类或子类或接口)的实例。今后会介绍这个运算符。
3. 逻辑运算符
逻辑运算符用于检查表达式是真还是假。它们用于判断一个条件是否成立,从而做出决策。&&、 | 、!分别称为逻辑或、逻辑与、逻辑非。其运算规则如下表: | ||
---|---|---|---|
运算符 | 例子 | 含义 | |
&& | exp1 && exp2 | 仅当 exp1 和 expr2都为true时才为true | |
|| | exp1 || exp2 | 如果 exp1 或 exp2有一个为true,则为true | |
! | !exp | 如果exp为false则为true,如果exp为true则为false |
如:
class TestLogicalOperators{
public static void main(String[] args) {
int a = 7;
int b = 2;
int c = 5;
System.out.println((a > b) && (b > c)); // false
System.out.println((a > b) || (b > c)); // true
System.out.println(!(a == b)); // true
System.out.println(!(a > b)); // false
}
}
4.按位运算符
按位运算符是对整型数(byte、short、int、long)的单个位执行操作。 Java一共有7个位运算符:~、|、&、«、»、»>,它们分别称为按位补码、位或、位与、左移、右移、无符号右移。
按位补码~ 它反转运算数的每个二进制位的值(0 到 1 和 1 到 0)。如23的二进制是10111, ~23的二进制是01000,作为int类型的23除后5位外,前面的27位都是0,~23的前面27位都是1。
class TestBitwiseComplement {
public static void main(String[] args) {
int x = 23;
System.out.println(x); //输出23
System.out.println(Integer.toBinaryString(x)); //输出10111
int y = ~x;
System.out.println(y); //输出-24
System.out.println(Integer.toBinaryString(y)); //输出11111111111111111111111111101000
}
}
代码中”Integer.toBinaryString(x)”用Integer类的方法toBinaryString()将int类型的x转化为二进制字符串的形式,以输出x二进制形式。
**按位或 | **: |
对2个运算符按照对应的二进制位进行下面的运算:如果2个二进制位有一个为 1,则运算返回 1;否则,它返回 0。设a,b是2个二进制位其运算规则如表所示: | a | b | a|b | | — | — | — | | 0 | 0 | 0 | | 0 | 1 | 1 | | 1 | 0 | 1 | | 1 | 1 | 1 | 例如,45和27的二进制位的后6位是101101和011011,其余位都是0,则45|27的后6位是111111,其余位都是0,45|27的十进制数就是63(111111)。
class TestBitwiseOR {
public static void main(String[] args) {
int x = 45;
System.out.println(Integer.toBinaryString(x));
int y = 27;
System.out.println(Integer.toBinaryString(y));
int z = x|y;
System.out.println(Integer.toBinaryString(z));
System.out.println(z);
}
}
按位与 &: 对2个运算符按照对应的二进制位进行下面的运算:如果2个二进制位都是 1,则运算返回 1;否则,它返回 0。设a,b是2个二进制位其运算规则如表所示: | a | b | a&b | | — | — | — | | 0 | 0 | 0 | | 0 | 1 | 0 | | 1 | 0 | 0 | | 1 | 1 | 1 |
45&27的结果是9(其二进制的最后4位是1001,其余位是0)。
按位异或 ^: 对2个运算符按照对应的二进制位进行下面的运算:如果2个二进制位都是1或都是0,则运算返回 0;否则,它返回 1。设a,b是2个二进制位其运算规则如表所示: | a | b | a^b | | — | — | — | | 0 | 0 | 0 | | 0 | 1 | 1 | | 1 | 0 | 1 | | 1 | 1 | 0 |
45^27的结果是54(其二进制的最后6位是110110,其余位是0)。
左移运算符 «: 左移运算符«将所有位向左移动指定数量的二进制位,最左边的位(最高有效位)被丢弃,最右边的位置(最低有效位)空缺,空位用0补上。如”a«2”将a的二进制都向做移动2位,右边空出的2位填补0。”a«1”将a的二进制都向做移动1位,右边空出的2位填补0。如图是左移1位的左移运算示意图:
例如,45«2的结果是180(对应二进制位10110100)。
带符号的右移运算符 »: 右移运算符»将所有位向右移动指定数量的指定位,最低有效位(最右边)被丢弃,最高有效位(最左边)用符号位填充。
class TestSignedRightShiftTest{
public static void main(String[] args) {
int x = -4;
System.out.println(Integer.toBinaryString(x)); // 输出:11111111111111111111111111111100
System.out.println(Integer.toBinaryString(x>>1)); // 输出:11111111111111111111111111111110
System.out.println(x>>1); // 输出:-2
int y = 4;
System.out.println();
System.out.println(Integer.toBinaryString(y)); // 输出:100
System.out.println(Integer.toBinaryString(y>>1)); // 输出:10
System.out.println(y>>1); // 输出:2
}
}
无符号的右移运算符 »>: 和»的区别是: »>运算的最左边空出的位置用0代替符号位。
class TestUnsignedRightShiftTest{
public static void main(String[] args) {
int x = -4;
System.out.println(Integer.toBinaryString(x)); // 输出:11111111111111111111111111111100
System.out.println(Integer.toBinaryString(x>>1)); // 输出:11111111111111111111111111111110
System.out.println(x>>1); // 输出:-2
int y = 4;
System.out.println();
System.out.println(Integer.toBinaryString(y)); // 输出:100
System.out.println(Integer.toBinaryString(y>>1)); // 输出:10
System.out.println(y>>1); // 输出:2
System.out.println();
System.out.println(Integer.toBinaryString(x>>>1)); // 输出:1111111111111111111111111111110
System.out.println(x>>>1); // 输出:2147483646
System.out.println(Integer.toBinaryString(y>>>1)); // 输出:10
System.out.println(y>>>1); // 输出:2
}
}
5. 赋值运算符
赋值运算符在 Java 中用于为变量赋值。例如,
int age;
age = 15;
“age = 15”将整数15赋值给int类型变量age。赋值运算符可以和算术运算符或位运算符结合,构成复合赋值运算符。如:= += -= *= /= %= &= ^= |= <<= >>= >>>=
。
对于变量a和运算数b,“a+=b”相当于“a = a+b”。其余的复合赋值运算符以此类推。
6.一元运算符 一元运算符仅对一个操作数进行运算。例如,++ 是一个一元运算符,它将变量的值增加 1。也就是说,++2 将返回 3。如下表所示,共有5个一元运算符。 |运算符|含义| 变量 | 运算 | 输出值 | | - | — | – | – | – | | + | 一元加号:没有必要使用,因为数字默认就是正数 | int a=3 | +a | 3| | - | 一元负号:反转运算数的符号 | int a=3 | -a | -3 | | ++ | 自增运算符:将值递增 1 |int a=3 | ++a | 4 | | - | 自减运算符:将值减 1 |int a=3 | –a | 2 | | ! | 逻辑补码运算符:反转布尔值 |boolean a=true | !a | false |
++放在运算符的前面,称为前缀++,如++a。也可以放在运算符的后面,称为后缀++。如a++。
a = 2
++a; // a becomes 3
a++; // a becomes 4
--a; // a becomes 3
a--; // a becomes 2
前缀和后缀有一个重要的区别,就是表达式的结果是不一样的。
- 如果使用 ++ 运算符作为前缀,如:++a,则 a 的值递增 1;然后返回这个递增后的a的值。
- 如果使用 ++ 运算符作为后缀,如:a++,则首先返回a的原始值;然后 a 增加 1。
class TestPrefixPostfix {
public static void main(String[] args) {
int a = 2;
int b =++a;
System.out.println(a); // 输出: 3
System.out.println(b); // 输出: 3
a=2;
b = a++;
System.out.println(a); // 输出: 3
System.out.println(b); // 输出: 2
}
}
7.条件运算符 ?:
三元运算符(条件运算符)?: 是 条件语句if-then-else (条件语句将在语句一节内介绍)的简写。格式为:
Expression ? expression1 : expression2
其含义是:当Expression为true或非零值时,该表达式的结果为expression1,否则,结果为expression2。
float score = 70.5f;
string result = score>=60? "you passed!":"you failed!";
System.out.println(result); // 输出: you passed!
您的打赏是对我最大的鼓励!