# 2. 运算符和表达式

​	在Java中，使用算术运算符`+、-、*、/`表示加、减、乘、除运算。

​	当参与`/`运算时，两个操作数都是整数时，表示整除法；否则表示浮点除法。

​	整数的求余操作（取模）用`%`表示。例如：15/2=7，15%2=1，15.0/2=7.5。

​	值得注意，**整数被0除将会产生一个异常，而浮点数被0除将会得到无穷大或NaN的结果**。

| 算数运算符 | 说明   |
| ---------- | ------ |
| ＋         | 加     |
| －         | 减     |
| *          | 乘×    |
| /          | 除÷    |
| %          | 取余数 |



## 2.1 数学函数与常量

​	在Math类中，包含了各种各样的数学函数，在编写不同类别的程序时，可能需要的函数也不同。

> 想计算一个数值的平方根，可以使用sqrt方法：
>
> ```java
> double x = 4;
> double y = Math.sqrt(x);
> System.out.println(y);
> ```
>
> 输出为：2.0

​	在Java中，没有幂运算，因此需要借助于Math类的pow方法：

```java
double y = Math.pow(x, a);
```

​	将y的值设为x的a次幂($x^a$)。

​	pow方法有两个double类型的参数，其返回结果也为double类型。

> - Math类还提供了常用的三角函数：
>
>   - Math.sin；
>
>   - Math.cos；
>
>   - Math.tan；
>
>   - Math.atan；
>
>   - Math.atan2；
>
> - 指数函数以及它的反函数，自然对数以及10为底的对数：
>
>   - Math.exp;
>   - Math.log;
>   - Math.log10;
>
> - 两个用于表示$\pi和e$常量的近似值：
>
>   - Math.PI
>   - Math.E

​	如果不想再数学方法名和常量名前添加前缀"Math"，只需要在源文件的顶部添加代码：

```java
import static java.lang.Math.*;
```





## 2.2 结合赋值和运算符

​	可以在赋值中使用二元运算符，这是一种便捷的简写形式：

```java
x += 4;
//等价于
x = x + 4;
```

（一般地，将运算符放在=号的左边，如*=或%=）



## 2.3 自增与自减运算符

​	自增、自减运算符：n++将变量n的当前值加1，n--将n的值减1。

```java
int n = 12;
n++; //自增后，n=13
```

​	这些运算符只会改变变量的值，它们的操作数不能是数值。例如：4++是个非法语句。

​	自增与自减运算符还有一种“前缀”形式：++n，--n；后缀和前缀形式都会使变量值加1或减1。在表达式中，**前缀形式会先完成加1，而后缀形式会先使用变量原来的值**。

```java
int m = 7;
int n = 7;
int a = 2 * ++m; // a=16,m=8
int b = 2 * n--; // b=14,n=8
```



## 2.4 关系和boolean运算符

- 要检测**相等性**可以使用两个等号==：

```java
3 == 7 //返回false
```

- 检测**不相等**就使用!=：

```java
3 != 7 //返回true
```

- 经常使用的运算符还有：<小于，>大于，<=小于等于，>=大于等于；

- 感叹号！就是逻辑**非**运算符，运算符&&表示逻辑**“与“**运算符，运算符||表示逻辑**”或“**运算符；

```java
expression1 && expression2 
```

​	expression1和expression2计算返回的结果都为true时，整个表达式才会返回true；

​	若expression1和expression2计算返回的结果其中一个为false时，整个表达式返回的结果为false。

```java
expression1 || expression2
```

​	若expression1返回true则不计算expression2，将整个表达式的结果返回true；

​	若expression1返回false，计算expression2返回true，整个表达式结果也将会返回true；

​	若expression1和expression2的返回结果都是false，那整个表达式结果也将返回false。

- 三目运算符x?y:z，当x返回结果为true时就返回y，当x返回结果为false时就返回z。

```java
x < y ? x : y
```

将会返回x和y中较小的一个。



## 2.5 位运算符

​	处理整数类型时，可以直接对组成整型数值的各个位完成操作。位运算符包括：&("and")、|("or")、^("xor")、~("not")。另外还有>>和<<运算符将位模型左移或右移。



## 2.6 括号与运算符级别

运算符优先级：

| 结合性   | 运算符                                                 |
| -------- | ------------------------------------------------------ |
| 从左往右 | ()括号                                                 |
| 从右往左 | ！ ~ ++ -- + 一元运算  - 一元运算 （）强制类型转换 new |
| 从左往右 | * / %                                                  |
| 从左往右 | + -                                                    |
| 从左往右 | << >> >>>                                              |
| 从左往右 | < <= > >=                                              |
| 从左往右 | == !=                                                  |
| 从左往右 | &                                                      |
| 从左往右 | ^                                                      |
| 从左往右 | \|                                                     |
| 从左往右 | &&                                                     |
| 从左往右 | \|\|                                                   |
| 从右往左 | ?:                                                     |
| 从右往左 | = += -= *= /= %= &= \|= ^= <<= >>= >>>=                |

​	若不适用括号，就按照给出的运算符优先级次序进行计算。同一个级别的运算符按照从左到右的次序进行计算（除了表中给出的右结合运算符外）。



## 参考资料

[1] 《Java核心技术 卷I 基础知识》  ------【美】凯S. 霍斯特曼