掌握Java的运算符和表达式
发布时间: 2023-12-13 04:19:26 阅读量: 32 订阅数: 35
# 1. 介绍
## 1.1 Java的运算符和表达式的基本概念
## 1.2 为什么掌握运算符和表达式是重要的
在Java编程中,运算符和表达式是非常基础而且重要的概念。运算符用于执行各种操作,而表达式则是由运算符和操作数组成的。本章将介绍Java中的运算符和表达式的基本概念以及它们的重要性。
## 算术运算符
### 3. 关系运算符
在这一部分,我们将讨论Java中的关系运算符,这些运算符用于比较两个值,并返回一个布尔值(true或false)作为结果。关系运算符通常用于控制程序的流程和决策。
#### 3.1 等于运算符
等于运算符(==)用于检查两个操作数是否相等。如果相等,则返回true;如果不相等,则返回false。
```java
int a = 5;
int b = 7;
boolean isEqual = (a == b); // false
```
#### 3.2 不等于运算符
不等于运算符(!=)用于检查两个操作数是否不相等。如果不相等,则返回true;如果相等,则返回false。
```java
int a = 5;
int b = 7;
boolean isNotEqual = (a != b); // true
```
#### 3.3 大于和小于运算符
大于运算符(>)用于检查左操作数是否大于右操作数,如果是,则返回true;否则返回false。小于运算符(<)则相反,用于检查左操作数是否小于右操作数。
```java
int a = 5;
int b = 7;
boolean isGreater = (a > b); // false
boolean isLess = (a < b); // true
```
#### 3.4 大于等于和小于等于运算符
大于等于运算符(>=)用于检查左操作数是否大于或等于右操作数,如果是,则返回true;否则返回false。小于等于运算符(<=)则相反,用于检查左操作数是否小于或等于右操作数。
```java
int a = 5;
int b = 5;
boolean isGreaterOrEqual = (a >= b); // true
boolean isLessOrEqual = (a <= b); // true
```
关系运算符在控制流程、条件语句和循环结构中起着重要作用,能够帮助程序根据不同的条件做出相应的决策。
## 4. 逻辑运算符
逻辑运算符用于在条件语句中对布尔值进行判断和组合,主要包括与运算符、或运算符、非运算符和短路运算。
### 4.1 与运算符
与运算符(&&)用于判断多个条件同时成立,只有当所有条件都为真时,整个表达式才为真。否则,只要有一个条件为假,整个表达式就为假。示例代码如下:
```java
int num = 10;
if (num > 0 && num < 100) {
System.out.println("num在0和100之间");
} else {
System.out.println("num不在0和100之间");
}
```
**注释:** 在上述代码中,首先定义了一个整型变量num的值为10。然后使用与运算符判断条件,当num大于0且小于100时,输出"num在0和100之间";否则,输出"num不在0和100之间"。由于num的值为10,满足所设定的条件,因此输出"num在0和100之间"。
### 4.2 或运算符
或运算符(||)用于判断多个条件其中之一成立,只要有一个条件为真,整个表达式就为真。否则,当所有条件为假时,整个表达式就为假。示例代码如下:
```java
int num = 10;
if (num > 100 || num < 0) {
System.out.println("num大于100或小于0");
} else {
System.out.println("num在0和100之间");
}
```
**注释:** 在上述代码中,还是首先定义了一个整型变量num的值为10。然后使用或运算符判断条件,当num大于100或小于0时,输出"num大于100或小于0";否则,输出"num在0和100之间"。由于num的值为10,不满足所设定的条件,因此输出"num在0和100之间"。
### 4.3 非运算符
非运算符(!)是一个一元运算符,用于对布尔值进行取反操作。如果表达式为真,则取反后为假;如果表达式为假,则取反后为真。示例代码如下:
```java
int num = 10;
if (!(num > 0 && num < 100)) {
System.out.println("num不在0和100之间");
} else {
System.out.println("num在0和100之间");
}
```
**注释:** 在上述代码中,同样首先定义了一个整型变量num的值为10。然后使用非运算符对之前的条件进行取反操作,相当于判断条件为假的情况。由于num的值为10,满足之前设定的条件,因此取反后为假,输出"num不在0和100之间"。
### 4.4 短路运算
短路运算是逻辑运算符中的一种特性,即在某些情况下只对表达式的一部分进行计算,而不对整个表达式进行计算。在与运算符中,如果第一个条件为假,那么整个表达式就为假,无需再判断后续条件。在或运算符中,如果第一个条件为真,那么整个表达式就为真,无需再判断后续条件。示例代码如下:
```java
int num = 5;
int result = 0;
if (num > 0 && (result = num * 2) > 10) {
System.out.println("条件成立");
} else {
System.out.println("条件不成立");
System.out.println("result的值为:" + result);
}
```
**注释:** 在上述代码中,定义了一个整型变量num的值为5,以及一个整型变量result的初始值为0。在if语句的条件中,num大于0满足第一个条件,但后续的(result = num * 2) > 10并不会执行,因为已经满足整个条件,所以输出"条件成立"。由于result没有被赋值,因此输出"result的值为:0"。
## 5. 位运算符
位运算符是一种用于对二进制位进行操作的运算符。它们直接作用于整数的比特位,可以在处理底层数据和位运算的场景中发挥重要作用。以下是Java中常用的位运算符:
### 5.1 按位与、按位或、按位异或运算符
- `&` 按位与运算符:将操作数的每个比特位进行与操作,只有两个比特位都为1时,结果才为1。
- `|` 按位或运算符:将操作数的每个比特位进行或操作,只要两个比特位中有一个为1时,结果就为1。
- `^` 按位异或运算符:将操作数的每个比特位进行异或操作,只有两个比特位不同才为1。
这些位运算符通常用于数据的掩码生成和检测,以及对二进制表示的数据进行特定位的操作。
```java
int a = 5; // 二进制表示:101
int b = 3; // 二进制表示:011
int result1 = a & b; // 二进制表示:001,结果为1
int result2 = a | b; // 二进制表示:111,结果为7
int result3 = a ^ b; // 二进制表示:110,结果为6
```
### 5.2 左移和右移运算符
- `<<` 左移运算符:将操作数的每个比特位向左移动指定的位数,右侧空出的位用0填充。
- `>>` 右移运算符:将操作数的每个比特位向右移动指定的位数,左侧空出的位用原先最左侧的位填充,即有符号右移。
- `>>>` 无符号右移运算符:将操作数的每个比特位向右移动指定的位数,左侧空出的位用0填充,即无符号右移。
这些移位运算符通常用于对整数进行位移操作,实现乘以或除以2的幂次方的运算。
```java
int a = 5; // 二进制表示:101
int result1 = a << 2; // 二进制表示:10100,结果为20
int result2 = a >> 1; // 二进制表示:10,结果为2
int result3 = a >>> 1; // 二进制表示:10,结果为2
```
### 5.3 无符号右移运算符
无符号右移运算符 (`>>>`) 是Java中特有的位运算符,只能用于处理无符号的整数类型。它将操作数的每个比特位向右移动指定的位数,左侧空出的位用0填充。无符号右移运算符可以处理集合的整体平均值、位状态(0/1)的计数以及其他类似场景。
```java
int a = -10; // 二进制表示:11111111111111111111111111110110
int result = a >>> 2; // 二进制表示:00111111111111111111111111111101,结果为1073741821
```
从上述示例代码可以看出,无符号右移运算符对于正数没有影响,相当于普通右移运算符 (`>>`),但是对于负数则会改变其表示方式。
通过掌握位运算符,我们可以在一些特定场景中快速高效地操作二进制数据,提升程序的执行效率。
总结一下:
- 按位与 (`&`):只有两个比特位都为1时,结果为1。
- 按位或 (`|`):只要两个比特位中有一个为1时,结果为1。
- 按位异或 (`^`):只有两个比特位不同才为1。
- 左移 (`<<`):将操作数的每个比特位向左移动指定的位数,右侧空出的位用0填充。
- 右移 (`>>`):将操作数的每个比特位向右移动指定的位数,左侧空出的位用原先最左侧的位填充。
- 无符号右移 (`>>>`):将操作数的每个比特位向右移动指定的位数,左侧空出的位用0填充。
### 6. 运算符优先级与表达式
在本章节中,我们将深入了解Java中运算符的优先级以及如何使用表达式来组合和控制运算符的优先级。
#### 6.1 运算符优先级的概念
在Java中,每个运算符都有一个特定的优先级,这些优先级决定了表达式中运算符的计算顺序。例如,乘法运算符的优先级高于加法运算符,因此在同一个表达式中会先计算乘法后计算加法。这些优先级规则在编写复杂表达式时非常重要,能够帮助我们理解表达式的计算顺序。
#### 6.2 如何使用括号控制运算符优先级
在Java中,我们可以使用括号来显式地控制运算符的优先级。通过合理地使用括号,可以让代码更加清晰易懂,并且能够确保表达式在我们期望的顺序下进行计算。
```java
int result = (5 + 3) * 2;
// result的值为16,因为括号中的加法先计算,然后乘法
```
#### 6.3 各种运算符混合使用的表达式示例
下面是一个包含多种运算符的表达式示例,通过对这种复杂表达式的分析可以更好地理解运算符的优先级和结合性。
```java
int a = 10;
int b = 5;
int c = 3;
int result = a + b * c - (a % b);
// result的值为12,因为乘法和取模先计算,然后加法和减法
```
0
0