一元运算符(Unary Operators)是 Java 中一类只需一个操作数即可完成操作的特殊符号。它们广泛用于数值取反、逻辑反转、变量自增 / 自减以及位操作等场景,是编写简洁高效代码的重要工具。
掌握 Java 中 5 种核心一元运算符的用法
深入理解前置与后置自增 / 自减的区别
能够正确使用按位取反(~)并理解其底层原理
避免常见误区(如混淆 ++x 与 x++ 的返回值)
一元运算符作用于单个操作数,用于执行以下类型的操作:
✅ 所有运算符均只作用于一个操作数,故称“一元”。
-)将数值变为其相反数。
result = -operand;int n1 = 20;
n1 = -n1; // n1 变为 -20class Main {
public static void main(String[] args) {
int n1 = 20;
System.out.println("Number = " + n1); // 20
n1 = -n1;
System.out.println("Result = " + n1); // -20
}
}💡 注意:
-作为一元运算符时与二元减法(如a - b)不同,前者仅作用于一个操作数。
!)用于反转布尔值:true → false,false → true。
result = !booleanExpression;boolean cond = true;
System.out.println(!cond); // false
int a = 10, b = 1;
System.out.println(!(a < b)); // true(因为 a < b 为 false)class Main {
public static void main(String[] args) {
boolean cond = true;
int a = 10, b = 1;
System.out.println("Cond is: " + cond); // true
System.out.println("Now cond is: " + !cond); // false
System.out.println("!(a < b) = " + !(a < b)); // true
System.out.println("!(a > b) = " + !(a > b)); // false
}
}✅ 常用于条件判断中,如
if (!isValid)表示“如果不合法”。
++)将整型变量的值增加 1。分为前置和后置两种形式。
x++)先使用原值,再加 1
表达式返回的是自增前的值
++x)先加 1,再使用新值
表达式返回的是自增后的值
int x = 5;
int a = x++; // a = 5, x = 6
int b = ++x; // b = 7, x = 7初始: x = 5
x++ → 返回 5,然后 x 变为 6
++x → x 先变为 6,然后返回 6--)将整型变量的值减少 1,同样分为前置与后置。
x--)先使用原值,再减 1
返回自减前的值
--x)先减 1,再使用新值
返回自减后的值
int y = 5;
int p = y--; // p = 5, y = 4
int q = --y; // q = 3, y = 3~)对操作数的每一位二进制位进行翻转(0 → 1,1 → 0),结果以补码形式存储。
Java 使用二进制补码表示整数:
正数:直接存储
负数:取反后加 1
因此,~n 的数学等价公式为:
~n = -(n + 1)int n = 6; // 二进制: 000...0110
~n // 取反: 111...1001 → 补码表示为 -7class Main {
public static void main(String[] args) {
int n1 = 6, n2 = -2;
System.out.println("6's bitwise complement = " + ~n1); // -7
System.out.println("-2's bitwise complement = " + ~n2); // 1
}
}✅ 验证公式:
~6 = -(6 + 1) = -7
~(-2) = -(-2 + 1) = -(-1) = 1
以下程序集中展示所有基本一元运算符的行为:
import java.util.Scanner;
public class UnaryOperators {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = 10; // 可替换为用户输入:sc.nextInt()
// 一元正号(通常无实际效果)
int result = +num;
System.out.println("Unary plus: " + result); // 10
// 一元负号
result = -num;
System.out.println("Unary minus: " + result); // -10
// 前置自增
result = ++num; // num 先变为 11,result = 11
System.out.println("Pre-increment: " + result); // 11
// 后置自增
result = num++; // result = 11, num 变为 12
System.out.println("Post-increment: " + result); // 11
// 前置自减
result = --num; // num 先变为 11,result = 11
System.out.println("Pre-decrement: " + result); // 11
// 后置自减
result = num--; // result = 11, num 变为 10
System.out.println("Post-decrement: " + result); // 11
sc.close();
}
}Unary plus: 10
Unary minus: -10
Pre-increment: 11
Post-increment: 11
Pre-decrement: 11
Post-decrement: 11🔍 关键观察:
post-increment和post-decrement返回的是操作前的值,而变量本身已改变。
简洁高效:一行代码完成变量修改
性能优越:底层直接对应 CPU 指令(如 INC)
灵活控制:前置 / 后置满足不同逻辑需求
避免在复杂表达式中混用 ++/--
❌ 错误示例:arr[i++] = ++i;(行为未定义,难以维护)
优先使用前置形式(如 ++i)
在不需要原值时,前置形式效率略高(无需临时保存旧值)
理解 ~ 的数学含义
记住公式 ~n == -(n + 1),避免手动计算二进制
谨慎使用 ! 嵌套
❌ 避免 !!!flag,应改写为 flag 或添加注释
为什么 int x = 5; System.out.println(x++ + ++x); 的输出是 12?请逐步分析执行过程。
如何利用 ~ 运算符快速判断一个整数是否为 -1?
编写一个程序,使用 ! 和关系运算符组合,判断一个年份是否为非闰年。