Java运算符详解
前言
在Java编程语言中,运算符是构建表达式和执行各种操作(如算术运算、比较运算、逻辑运算和位运算等)的关键组成部分。这些运算符与操作数一起协同工作,实现了程序中的数据处理和计算。
运算符主要包含了以下几个:算术运算符、关系运算符(比较运算符)、逻辑运算符、位运算符、条件运算符
分类
一、算术运算符
算术运算符用于执行基本的数学运算。
int a = 5;
int b = 3;
// 加法运算符
int sum = a + b; // sum = 8
// 减法运算符
int difference = a - b; // difference = 2
// 乘法运算符
int product = a * b; // product = 15
// 除法运算符(对于整数,结果是整数除法)
int quotient = a / b; // quotient = 1
// 浮点数除法(为了得到精确的小数结果,需要将操作数之一转换为double)
double doubleQuotient = (double) a / b; // doubleQuotient = 1.6666666666666667
// 取模运算符(求余数)
int remainder = a % b; // remainder = 2
// 增量运算符
a++; // a = 6
b--; // b = 2
// 复合赋值运算符
a += b; // a = 8 (相当于 a = a + b)
a -= b; // a = 6 (相当于 a = a - b)
a *= b; // a = 18 (相当于 a = a * b)
a /= b; // a = 6 (相当于 a = a / b,但因为是整数除法,结果向下取整)
a %= b; // a = 0 (相当于 a = a % b)
二、关系运算符(比较运算符)
关系运算符用于比较两个操作数的大小或是否相等,并返回布尔值。
int x = 10;
double y = 10.5;
// 等于运算符
boolean isEqual = x == y; // isEqual = false (整数与浮点数比较,类型不同则不相等)
// 不等于运算符
boolean isNotEqual = x != y; // isNotEqual = true
// 大于、小于、大于等于、小于等于运算符
boolean isGreaterThan = x > y; // isGreaterThan = false
boolean isLessThan = x < y; // isLessThan = true
boolean isGreaterThanOrEqual = x >= y; // isGreaterThanOrEqual = false
boolean isLessThanOrEqual = x <= y; // isLessThanOrEqual = true
三、逻辑运算符
逻辑运算符用于连接布尔表达式,返回布尔值。
boolean flag1 = true;
boolean flag2 = false;
// 逻辑与运算符
boolean andResult = flag1 && flag2; // andResult = false
// 逻辑或运算符
boolean orResult = flag1 || flag2; // orResult = true
// 逻辑非运算符
boolean notResult = !flag1; // notResult = false
// 逻辑异或运算符(Java没有专门的异或运算符,但可以通过其他方式实现)
boolean xorResult = (flag1 && !flag2) || (!flag1 && flag2); // xorResult = true
四、位运算符
位运算符直接对整数类型的二进制位进行操作。
int bit1 = 60; // 二进制:0011 1100
int bit2 = 13; // 二进制:0000 1101
// 位与运算符
int andBits = bit1 & bit2; // andBits = 12 (二进制:0000 1100)
// 位或运算符
int orBits = bit1 | bit2; // orBits = 61 (二进制:0011 1101)
// 位异或运算符
int xorBits = bit1 ^ bit2; // xorBits = 49 (二进制:0011 0001)
// 位非运算符(注意,位非运算符是对单个数值进行操作的)
int notBits = ~bit1; // notBits = -61 (二进制:1100 0011 取反后加1,因为int是有符号的)
// 左移运算符
int leftShift = bit1 << 2; // leftShift = 240 (二进制:1
条件运算符
三目运算符:
三目运算符(也称为条件运算符)在Java中用于根据条件判断来赋值。它的语法形式如下:
variable = (condition) ? expression1 : expression2;
这里的condition是一个布尔表达式,如果condition为真(true),则variable被赋值为expression1的结果,否则被赋值为expression2的结果。
例如:
int a = 10;
int b = 20;
int max = (a > b) ? a : b; // max 将被赋值为 20,因为 a 不大于 b
运算符的优先级
在Java中,当表达式中包含多个运算符时,运算符的优先级决定了它们执行的顺序。优先级高的运算符会先执行,优先级低的运算符后执行。如果优先级相同,那么会按照从左到右的顺序执行。
以下是一些基本的优先级规则:
- 括号内的表达式优先执行。
- 单目运算符(如++、–、!、~等)优先级最高。
- 算术运算符(如*、/、%等)优先级高于比较运算符(如>、<、==等)。
- 比较运算符优先级高于逻辑运算符(如&&、||等)。
- 赋值运算符(如=、+=、-=等)优先级最低。
当需要改变默认的优先级顺序时,可以使用括号来明确指定表达式的执行顺序。
例子1:
int result = 1 + 2 * 3 / 4 - 5;
在这个例子中,我们需要根据运算符的优先级来计算。首先,乘法*和除法/的优先级高于加法+和减法-。因此,2 * 3先计算得到6,然后6 / 4得到1(在Java中,整数除法会丢弃小数部分)。接下来,1 + 1得到2,最后2 - 5得到-3。所以result的值是-3。
例子2:
int a = 5, b = 10, c = 15;
int max = (a > b) ? a : ((b > c) ? b : c);
这个例子中使用了条件运算符(三目运算符)。首先,(a > b)为false,因为5不大于10。由于条件不满足,所以不会返回a的值,而是计算后面的表达式((b > c) ? b : c)。在这个子表达式中,(b > c)也为false,因为10不大于15。因此,最终返回c的值,即15。所以max的值是15。
例子3:
int complex = 3 + 4 * 2 / (1 - 5) + 7;
这个例子中,首先计算括号内的1 - 5,得到-4。然后,由于除法/的优先级高于加法+和乘法*,所以4 * 2 / -4先计算。4 * 2得到8,然后8 / -4得到-2。接下来,3 + -2得到1,最后1 + 7得到8。所以complex的值是8。