【Java 基础编程】Java 运算符完全指南:算术/关系/逻辑/位运算与优先级,避免常见坑

运算符是程序进行数据运算和逻辑判断的基础工具,理解各种运算符的特性和优先级是编写正确、高效代码的关键。

⚡ 快速参考

  • 算术运算符:+-*/%++--
  • 关系运算符:==!=><>=<=
  • 逻辑运算符:&&||!(短路运算符效率高)
  • 赋值运算符:=+=-=*=/=%=
  • 三元运算符:条件 ? 值1 : 值2

📚 学习目标

  1. 掌握各种运算符的使用方法和特点
  2. 理解前置自增/自减与后置的区别
  3. 理解短路运算符(&&、||)与逻辑运算符(&、|)的区别
  4. 掌握运算符优先级,能正确计算表达式结果

一、运算符概述

1.1 什么是运算符?

运算符: 一种特殊的符号,用以表示数据的运算、赋值和比较等。

Java 运算符分类:

  1. 算术运算符:+-*/%++--
  2. 赋值运算符:=+=-=*=/=%=
  3. 关系运算符:==!=><>=<=instanceof
  4. 逻辑运算符:&&||!&|^
  5. 位运算符:&|^~<<>>>>>
  6. 三元运算符:? :

二、算术运算符

2.1 基本算术运算符

运算符 说明 示例 结果
+ 加法 5 + 3 8
- 减法 5 - 3 2
* 乘法 5 * 3 15
/ 除法 5 / 3 1(整数除法)
% 取模(取余) 5 % 3 2

2.2 除法运算注意事项

整数除法:

java 复制代码
int a = 10;
int b = 3;
int c = a / b;
System.out.println(c);  // 3(舍弃小数部分)

// 得到小数结果
double d = (double) a / b;
System.out.println(d);  // 3.3333333333333335

除数不能为0:

java 复制代码
int a = 10;
int b = 0;
int c = a / b;  // ArithmeticException: / by zero

2.3 取模运算

取模公式: a % b = a - a / b * b

示例:

java 复制代码
System.out.println(10 % 3);   // 1
System.out.println(-10 % 3);  // -1(符号与被除数相同)
System.out.println(10 % -3);  // 1(符号与被除数相同)
System.out.println(-10 % -3); // -1

2.4 自增自减运算符

运算符 说明 示例
++ 自增 i++++i
-- 自减 i----i

前置和后置的区别:

java 复制代码
// 前置:先自增/自减,再使用
int a = 10;
int b = ++a;  // a先变成11,再赋值给b
System.out.println(a);  // 11
System.out.println(b);  // 11

// 后置:先使用,再自增/自减
int c = 10;
int d = c++;  // c的值10先赋值给d,然后c自增为11
System.out.println(c);  // 11
System.out.println(d);  // 10

独立使用时无区别:

java 复制代码
int a = 10;
a++;    // a = 11
++a;    // a = 12(两者效果相同)

三、赋值运算符

3.1 基本赋值运算符

符号: =

示例:

java 复制代码
int a = 10;      // 将10赋值给a
int b = a;       // 将a的值赋值给b
int c = b = a;   // 从右向左执行

3.2 复合赋值运算符

运算符 说明 等价于
+= 加后赋值 a = a + b
-= 减后赋值 a = a - b
*= 乘后赋值 a = a * b
/= 除后赋值 a = a / b
%= 取模后赋值 a = a % b

示例:

java 复制代码
int a = 10;
a += 5;  // 等价于 a = a + 5,a = 15
a -= 3;  // 等价于 a = a - 3,a = 12
a *= 2;  // 等价于 a = a * 2,a = 24
a /= 4;  // 等价于 a = a / 4,a = 6
a %= 4;  // 等价于 a = a % 4,a = 2

注意: 复合赋值运算符会自动进行类型转换

java 复制代码
byte b = 10;
// b = b + 1;  // ❌ 错误:b + 1 的结果是 int
b += 1;        // ✅ 正确:自动转换为 byte

四、关系运算符

4.1 关系运算符列表

运算符 说明 示例 结果
== 相等 5 == 3 false
!= 不等 5 != 3 true
> 大于 5 > 3 true
< 小于 5 < 3 false
>= 大于等于 5 >= 5 true
<= 小于等于 3 <= 5 true
instanceof 类型判断 "" instanceof String true

4.2 关系运算符特点

1. 结果都是 boolean 型

java 复制代码
int a = 10;
int b = 20;
boolean result = a > b;  // false

2. 常用于条件判断和循环

java 复制代码
if (a > b) {
    System.out.println("a 大于 b");
}

while (a < 100) {
    a++;
}

3. 注意 == 和 = 的区别

java 复制代码
int a = 10;
int b = 20;

if (a = b) { }  // ❌ 错误:= 是赋值,不是比较
if (a == b) { } // ✅ 正确:== 是比较

五、逻辑运算符

5.1 逻辑运算符列表

用于连接多个条件,结果为 boolean 值。

运算符 名称 说明 示例
&& 短路与 两个条件都为 true,结果才为 true a > 0 && b > 0
` ` 短路或
! 非(取反) 取反 !(a > 0)
& 逻辑与 两个条件都为 true,结果才为 true a > 0 & b > 0
` ` 逻辑或 有一个条件为 true,结果就为 true
^ 异或 两个条件不同时为 true a > 0 ^ b > 0

5.2 短路与(&&)和逻辑与(&)

真值表:

a b a && b a & b
true true true true
true false false false
false true false false
false false false false

区别:

java 复制代码
int a = 5;
int b = 10;

// 短路与:第一个条件为 false,不再判断第二个条件
boolean r1 = (a > 10) && (++b > 10);
System.out.println(b);  // 10(b 没有自增)

// 逻辑与:无论第一个条件如何,都会判断第二个条件
boolean r2 = (a > 10) & (++b > 10);
System.out.println(b);  // 11(b 自增了)

结论:

  • && 效率高(短路)
  • 开发中推荐使用 &&

5.3 短路或(||)和逻辑或(|)

真值表:

a b a || b a | b
true true true true
true false true true
false true true true
false false false false

区别:

java 复制代码
int a = 5;
int b = 10;

// 短路或:第一个条件为 true,不再判断第二个条件
boolean r1 = (a > 0) || (++b > 10);
System.out.println(b);  // 10(b 没有自增)

// 逻辑或:无论第一个条件如何,都会判断第二个条件
boolean r2 = (a > 0) | (++b > 10);
System.out.println(b);  // 11(b 自增了)

结论:

  • || 效率高(短路)
  • 开发中推荐使用 ||

5.4 非运算符(!)

作用: 取反

示例:

java 复制代码
boolean a = true;
boolean b = !a;   // false

int age = 20;
boolean isAdult = age >= 18;      // true
boolean isChild = !isAdult;       // false

5.5 异或运算符(^)

规则: 两个条件不同时为 true

真值表:

a b a ^ b
true true false
true false true
false true true
false false false

示例:

java 复制代码
System.out.println(true ^ true);    // false
System.out.println(true ^ false);   // true
System.out.println(false ^ true);   // true
System.out.println(false ^ false);  // false

六、三元运算符

6.1 语法

java 复制代码
条件表达式 ? 表达式1 : 表达式2

执行流程:

  • 如果条件表达式为 true,返回表达式1的值
  • 如果条件表达式为 false,返回表达式2的值

6.2 示例

获取两个数的最大值:

java 复制代码
int a = 10;
int b = 20;
int max = a > b ? a : b;
System.out.println(max);  // 20

判断奇偶:

java 复制代码
int num = 15;
String result = num % 2 == 0 ? "偶数" : "奇数";
System.out.println(result);  // 奇数

等价的 if-else:

java 复制代码
int a = 10;
int b = 20;
int max;

if (a > b) {
    max = a;
} else {
    max = b;
}

// 等价于
int max = a > b ? a : b;

七、位运算符

7.1 位运算符列表

运算符 名称 说明
& 按位与 两位都为1,结果为1
` ` 按位或
^ 按位异或 两位不同,结果为1
~ 按位取反 0变1,1变0
<< 左移 左移n位,相当于乘以2^n
>> 右移 右移n位,相当于除以2^n
>>> 无符号右移 右移,高位补0

7.2 位运算示例

按位与(&):

java 复制代码
int a = 5;   // 二进制:0101
int b = 3;   // 二进制:0011
int c = a & b;  // 0001 = 1
System.out.println(c);  // 1

按位或(|):

java 复制代码
int a = 5;   // 二进制:0101
int b = 3;   // 二进制:0011
int c = a | b;  // 0111 = 7
System.out.println(c);  // 7

按位异或(^):

java 复制代码
int a = 5;   // 二进制:0101
int b = 3;   // 二进制:0011
int c = a ^ b;  // 0110 = 6
System.out.println(c);  // 6

按位取反(~):

java 复制代码
int a = 5;   // 二进制:0000 0101
int b = ~a;  // 1111 1010 = -6(补码)
System.out.println(b);  // -6

7.3 移位运算

左移(<<):

java 复制代码
int a = 3;      // 二进制:0011
int b = a << 2; // 左移2位:1100 = 12
System.out.println(b);  // 12(相当于 3 * 2^2)

右移(>>):

java 复制代码
int a = 12;     // 二进制:1100
int b = a >> 2; // 右移2位:0011 = 3
System.out.println(b);  // 3(相当于 12 / 2^2)

// 负数右移,高位补1
int c = -8;     // 1111 1000
int d = c >> 2; // 1111 1110 = -2
System.out.println(d);  // -2

无符号右移(>>>):

java 复制代码
int a = -8;      // 1111 1111 1111 1111 1111 1111 1111 1000
int b = a >>> 2; // 0011 1111 1111 1111 1111 1111 1111 1110
System.out.println(b);  // 1073741822(高位补0)

注意: 没有 <<< 运算符!


八、运算符优先级

8.1 优先级表

优先级 运算符 说明
1 (), [], . 括号、数组、成员访问
2 ++, --, !, ~ 一元运算符
3 *, /, % 乘除模
4 +, - 加减
5 <<, >>, >>> 移位
6 <, <=, >, >=, instanceof 关系
7 ==, != 相等
8 & 按位与
9 ^ 按位异或
10 ` `
11 && 逻辑与
12 `
13 ? : 三元
14 =, +=, -=, *=, /=, %= 赋值

8.2 记忆技巧

口诀:

复制代码
单目乘除为关系,
逻辑三目后赋值

建议: 不确定优先级时,使用小括号明确运算顺序!


九、标识符命名规范

9.1 命名规则(必须遵守)

  1. 由字母、数字、下划线(_)、美元符号($)组成
  2. 不能以数字开头
  3. 不能使用关键字和保留字
  4. 区分大小写

示例:

java 复制代码
// ✅ 合法
int age;
int _age;
int $age;
int age1;

// ❌ 非法
int 1age;      // 数字开头
int class;     // 关键字
int user-name; // 包含非法字符

9.2 命名规范(建议遵守)

1. 包名:全部小写

java 复制代码
package com.example.demo;
package com.alibaba.fastjson;

2. 类名、接口名:大驼峰(每个单词首字母大写)

java 复制代码
class Person { }
class StudentInfo { }
interface UserService { }

3. 方法名、变量名:小驼峰(第一个单词小写,其他首字母大写)

java 复制代码
int age;
String userName;
public void getUserInfo() { }
public void calculateTotalScore() { }

4. 常量名:全部大写,单词间用下划线分隔

java 复制代码
final int MAX_VALUE = 100;
final double PI = 3.14159;
final String DB_URL = "jdbc:mysql://localhost:3306/test";

5. 见名知义

java 复制代码
// ❌ 不好的命名
int a;
String s;
public void m() { }

// ✅ 好的命名
int age;
String userName;
public void calculateScore() { }

📚 快速记忆

1. 运算符分类:

  • 算术:+-*/%++--
  • 关系:==!=><>=<=
  • 逻辑:&&||!&|^
  • 赋值:=+=-=*=/=%=
  • 三元:? :

2. 注意事项:

  • 除法:整数相除结果为整数
  • ++i vs i++:前置先自增,后置先使用
  • && vs &:短路与效率高(推荐)
  • || vs |:短路或效率高(推荐)

3. 优先级:

  • 括号优先级最高
  • 单目 > 算术 > 关系 > 逻辑 > 三元 > 赋值
  • 不确定时使用括号
相关推荐
专注echarts研发20年5 小时前
如何实现 QLabel 的 Click 事件?Qt 富文本超链接优雅方案
开发语言·qt
时艰.5 小时前
Java 并发编程核心知识点
java·开发语言
雾削木5 小时前
使用 ESPHome 的核心指令
java·前端·javascript·单片机·嵌入式硬件
xyq20245 小时前
抽象工厂模式
开发语言
冰暮流星5 小时前
javascript如何实现将一个整数倒过来输出
开发语言·前端·javascript
Dylan的码园5 小时前
深入浅出Java排序:从基础算法到实战优化(下)
java·算法·排序算法
凤年徐5 小时前
C++ STL list 容器详解:使用与模拟实现
开发语言·c++·后端·list
中二病码农不会遇见C++学姐5 小时前
文明6 Mod制作核心组件关系解密:从XML到游戏的奇幻漂流
java·运维·服务器·游戏
我爱娃哈哈5 小时前
SpringBoot + ResponseBodyEmitter 实时异步流式推送:告别轮询,让数据推送更高效
java·spring boot·后端