运算符


类别 Java 运算符
算数运算符 + - * / % ++ –
扩展赋值运算符 += -= *= /= %=
比较运算符 > < >= <= == !=
逻辑运算符 &&、丨丨、!
位运算符 & 丨 ^ ~ >> << >>>
赋值运算符 =

算数运算符

在 Java 中,使用算数运算符 + 、- 、* 、/ 表示加、减、乘、除运算。当参与 / 运算的两个操作数都是整数时,表示整数除法;否则,表示浮点除法。整数的求余操作(有时称为取模)用 % 表示。

整数被 0 除将会产生一个异常,而浮点数被 0 除将会得到无穷大或 NaN 结果。

可以在赋值语句中采用一种简化的格式书写二元算术运算符:

a += 2;
b -= 2;
c *= 2;
d /= 2;
e %= 2;

该写法等同于:

a = a + 4;
b = b - 2;
c = c * 2;
d = d / 2;
e = e % 2;

### 自增运算符与自减运算符 加 1 、减 1 是数值变量最常见的操作,所以 Java 使用了两种自增、两种自减运算符: **++n 和 n++ 将变量 n 的当前值加 1;** **--n 和 n-- 将变量 n 的当前值减 1;**

前缀与后缀区别:

int m = 7;
int n = 7;
int a = 2 * ++m;//现在 a 是 16 ,m 是 8
int b = 2 * n++;//现在 b 是 14 ,n 是 8
  • 因为这些运算符改变了变量的值,所以它的操作数不能使数值,例如,2++ 就是一条非法的语句。
  • 建议不要在其他表达式的内部使用 ++ 或 –,这样编写的代码很容易令人困惑,并会产生烦人的 bug 。

## 关系运算符与 boolean 运算符 **关系运算符:** >`==` 检测左右两边是否相等 `!=` 检测左右两边是否不相等 `<` 检测左边是否小于右边 `>` 检测左边是否大于右边 `<=` 检测左边是否小于或等于右边 `>=` 检测左边是否大于或等于右边

boolean 运算符:

&& 逻辑“与”
|| 逻辑“或”
! 逻辑“非”

&& 和 || 是按照“短路”方式求值的。如果第一个操作数已经能够确定表达式的值,则第二个操作数就不必计算了:

if (x != 0 && 1 / x > x + y) //当 x 为 0 时,不会计算第二部分。因此也不会出现除以 0 的错误。

## 位运算符 **位运算符可以直接对组成整型数值的各个位进行操作。**位运算符包括:&, |, ^, ~, >>, << 和 >>>。 ### & 运算符 按位“与”运算:二进制位都为 1 则为 1 ,例:
int a = 0b1010 & 0b1100;//结果为 0b1000 ,也就是 a = 8

| 运算符

按位“或”运算:二进制位有一个为 1 则为 1 ,例:

int a = 0b1010 & 0b1100;//结果为 0b1110 ,也就是 a = 14

^ 运算符

按位“异或”运算:二进制位不同为 1 ,相同为 0 ,例:

int a = 0b1010 & 0b1100;//结果为 0b0110 ,也就是 a = 6

~ 运算符

按位“非”运算:二进制位取反,1 变 0 ,0 变 1 ,例:

int a = ~10;//10 的二进制是 0b1010, 结果为 0b0101 ,也就是 a = 5

>> 运算符

“右移”运算:将二进制位进行右移运算,用符号位填充高位:

int a = 2;//0b0010
int b = a >> 1;//将 a 右移 1 位,b = 0b0001 ,也就是 b = 1

<< 运算符

“左移”将二进制位进行左移运算,用 0 填充低位:

int a = 2;//0b0010
int b = a << 2;//将 a 左移 2 位,b = 0b1000 ,也就是 b = 8

>>> 运算符

无符号“右移” 将二进制位进行右移运算,用 0 填充高位:

int a = -8;//0b1000
int b = a >>> 1;//将 a 无符号右移 1 位,b = 0b0100 ,也就是 b = 4

这些运算符在位模式下工作,意味着可以使用屏蔽技术获得整数中的各个位,例如:

int n = x;//假设 n 是一个整型变量
int fourthBitFromRight = (n & 0b1000) / 0b1000;
//如果用二进制表示的 n 从右数第四位为 1 ,则返回 1 ,否则返回 0 。
//也可以用移位运算实现:
fourthBitFromRight = (n & (1 << 3)) >> 3;

按位运算都是补码运算的:

int a = 19;//0001 0011
System.out.println(~a);//按位取反为 11101100,此时仍为补码,换算原码为 10010100,也就是-20

## 附:运算符优先级

运算符优先级


文章作者: CrazyBunQnQ
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 CrazyBunQnQ !
 上一篇
流程控制 流程控制
块作用域学习流程控制之前,先来了解以下块作用域:块(即符合语句)是指由一对花括号括起来的若干条简单的 Java 语句。块确定了变量的作用域。一个块可以嵌套在另一个块中。但是不能再嵌套的两个块中声明同名的变量: public static v
2017-02-23
下一篇 
变量与常量 变量与常量
在数学中,变量就是数值可变的量,常量就是数值不可变的量,例如一条直线表达式 y = 2x 中 x 、y 就是变量,y 的值会随着 x 值的变化而变化,而 2 就是常量,无论 x 和 y 如何变化,2 都是 2,不会改变。Java 也类似。
2017-02-23
  目录