- 算术运算符:+、-、*、/、%、++、- -。
- 关系运算符:>、<、>=、<=、= = 、!=。
- 赋值运算符:=、+=、-=、*=、/=等。
- 逻辑运算符:!、&&、||等。
- 位运算符:~、&、|、^、>>、<<、>>>(无符号右移)。
算术运算符
从参与运算的因子的数量,可以将算术运算符分为以下 3 类。
- 单目运算符:+(取正)、-(取负)、++(自增 1)、–(自减 1)。
- 双目运算符:+、-、*、/、%(取余)。
- 三目运算符:(表达式 1)?(表达式 2):(表达式 3),当表达式 1 的结果为真时,整个运算的结果为表达式 2,否则为表达式 3,该运算符是 Java 语言唯一一个三目运算符,常被使用,需要掌握。
通过下面的程序,来重点学习++、–、%和三目运算符这四个算术运算符。
class ArithmeticOpr {
public static void main(String[] args) {
int i1 = 10, i2 = 20;
int i = (i2++); //++在i2后,故先运算(赋值)再自增
System.out.print("i = " + i);
System.out.println(" i2 = " + i2);
i = (++i2); //++在i2前,故先自增再运算(赋值)
System.out.print("i = " + i);
System.out.println(" i2 = " + i2);
i = (--i1); //--在i1前,故先自减再运算(赋值)
System.out.print("i = " + i);
System.out.println(" i1 = " + i1);
i = (i1--); //--在i1后,故先运算(赋值)再自减
System.out.print("i = " + i);
System.out.println(" i1 = " + i1);
System.out.println("10 % 3 = " + 10 % 3);
System.out.println("20 % 3 = " + 20 % 3);
int rst = (20 % 3) > 1 ? -10 : 10;
System.out.println("(20 % 3)>1 ? -10 : 10 = " + rst);
}
}
运行结果如下:
i = 20 i2 = 21 i = 22 i2 = 22 i = 9 i1 = 9 i = 9 i1 = 8 10 % 3 = 1 20 % 3 = 2 (20 % 3)>1 ? -10 : 10 = -10
通过这个例子可以看出,++ 和 - - 这两个运算符放在操作数前或后,决定着是先自增(或自减)再运算,还是先运算再自增(或自减)。
下面,再通过一个示例介绍变量和运算符的使用。
假设 Java 工程师的月薪按以下方式计算。
Java 工程师月薪=月底薪+月实际绩效+月餐补-月保险
其中:
- 月底薪为固定值。
- 月实际绩效=月绩效基数(月底薪 ×25%)× 月工作完成分数(最小值为 0,最大值为 150)/100。
- 月餐补=月实际工作天数 ×15。
- 月保险为固定值。
计算 Java 工程师月薪时,用户输入月底薪、月工作完成分数(最小值为 0,最大值为 150)、月实际工作天数和月保险 4 个值后,就可以计算出 Java 工程师月薪。详见以下程序。
import java.util.Scanner;
class CalSalary {
public static void main(String[] args) {
//Java工程师月薪
double engSalary = 0.0;
//底薪
int basSalary = 3000;
//月工作完成分数(最小值为0,最大值为150)
int comResult = 100;
//月实际工作天数
double workDay = 22;
//月应扣保险数
double insurance = 3000 * 0.105;
//从控制台获取输入的对象
Scanner input = new Scanner(System.in);
System.out.print("请输入Java工程师底薪:");
//从控制台获取输入—底薪,赋值给basSalary
basSalary = input.nextInt();
System.out.print("请输入Java工程师月工作完成分数(最小值为0,最大值为150):");
//从控制台获取输入—月工作完成分数,赋值给comResult
comResult = input.nextInt();
System.out.print("请输入Java工程师月实际工作天数:");
//从控制台获取输入—月实际工作天数,赋值给workDay
workDay = input.nextDouble();
System.out.print("请输入Java工程师月应扣保险数:");
//从控制台获取输入—月应扣保险数,赋值给insurance
insurance = input.nextDouble();
engSalary = basSalary + basSalary * 0.25 * comResult / 100
+ 15 * workDay - insurance;
System.out.println("Java工程师月薪为:" + engSalary);
}
}
结果如下:
请输入Java工程师底薪:6000 请输入Java工程师月工作完成分数(最小值为0,最大值为150):105 请输入Java工程师月实际工作天数:21 请输入Java工程师月应扣保险数:748 Java工程师月薪为:7142.0
逻辑运算符
关系运算符和赋值运算符比较简单,这里不展开介绍。需要注意的是,关系运算符“ == ”和赋值运算符“ = ”看起来比较类似,但含义完全不同,“ == ”用于判断两边是否相等,而“ = ”是将右边的值赋给左边。此外,关系运算符的比较结果是布尔类型,例如。
boolean flag = 3 > 2 ; //比较结果:true
+=、-=等是扩展的赋值运算符,x += y 等价于 x = x + y,程序员在实际的编程过程中,为了方便阅读,尽量不要使用这种扩展的赋值运算符。
接下来重点介绍逻辑运算符和位运算符。在 Java 语言中有 3 种逻辑运算符,它们是逻辑非(用符号“!”表示)、逻辑与(用符号“&&”表示)和逻辑或(用符号“||”表示)。
逻辑非表示取反,其逻辑关系值表如下表所示。
| A | ! A |
|---|---|
| true | false |
| false | true |
逻辑与的运算规则为:有一个运算数为假,其值为假,两个运算数都为真,其值为真。逻辑与的关系值表如下表所示。
| A | B | A && B |
|---|---|---|
| false | false | false |
| true | false | false |
| false | true | false |
| true | true | true |
逻辑或的运算规则为:有一个运算数为真,其值为真,两个运算数都为假,其值为假。逻辑或的关系值表如下表所示。
| A | B | A or B |
|---|---|---|
| false | false | false |
| true | false | true |
| false | true | true |
| true | true | true |
位运算符
在计算机中,所有的信息都是以二进制形式存储的。可以用位运算符对整数的二进制位进行操作。位运算符主要包括按位非(用符号“~”表示)、按位与(用符号“&”表示)、按位或(用符号“|”表示)、按位异或(用符号“^”表示)和移位运算符(用符号“<<”、“>>”、“>>>”表示)。
在企业面试 Java 工程师的时候,也常会问到“&&”和“&”以及“||”与“|”的区别,通过下面的学习,可以清楚地理解逻辑运算符和位运算符的区别。
按位非表示按位取反,其关系值表如下表所示。
按位非表示按位取反,其关系值表如下表所示。
| A | ~ A |
|---|---|
| 1 | 0 |
| 0 | 1 |
按位与是逐位逻辑与。按位与的关系值表如下表所示。
| A | B | A & B |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 0 |
按位或是逐位逻辑或。按位或的关系值表如下表所示。
| A | B | A or B |
|---|---|---|
| 1 | 1 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 0 | 0 | 0 |
按位异或是当两个运算位不同时(重点在“异”字),结果为 1,否则为 0。按位异或的关系值表如下表所示。
| A | B | A ^ B |
|---|---|---|
| 1 | 1 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 0 | 0 | 0 |



