HOWTO · Java

Java 中 `!=` 比较运算符与 `=!` 赋值取反表达式的区别

本文说明 Java 中 `!=` 不等于比较运算符与 `=!` 字符序列的区别,并解释 `=!` 在 `a = !b` 中表示先取反再赋值。

本页内容

在 Java 中,!= 是不等于比较运算符:当两个操作数的值不同时,结果为 true。字符序列 =! 本身不是运算符。在 a = !b 这样的表达式中,Java 将 = 解析为赋值,将 ! 解析为布尔取反,因此会把 b 取反后的值赋给 a。

下面的示例展示每次比较得到的布尔结果,以及赋值与取反结合时如何影响条件判断。

Java != 不等于比较示例

使用 != 比较两个值。两个值相等时,结果为 false;不同时,结果为 true。对于基本数值类型,它比较的是数值本身;对于引用类型,它比较的是两个引用是否指向不同的对象。若要对相等比较取反,可以写成 !(a == b),它与 a != b 的布尔结果相同。

该运算符的结果是布尔值,因此可以直接用于 if 条件,也可以存入布尔变量。例如,if (count != limit) 会在两个基本类型的值不同时执行。比较对象时,!= 检查的是对象身份,而不是对象内容;两个不同的 String 对象即使包含相同文本,按身份比较仍然是不相等的。如果要比较对象内容,请使用 equals。!(a == b) 中的括号清楚地表明了运算顺序:先判断是否相等,再对结果取反。理解这种等价关系有助于阅读较长的条件表达式,不过通常 a != b 写起来更简洁。

public class Main {
  public static void main(String[] args) {
    int a = 10;
    int b = 10;
    System.out.println(a != b);

    a = 20;
    System.out.println(a != b);
    System.out.println(!(a == b));
  }
}
false
true
true

第一组值相等,因此比较结果为 false。改变 a 的值后,两个值不再相同,所以不等于比较和取反后的相等比较都为 true。

Java =! 赋值与取反示例

Java 中没有组合起来的 =! 运算符。在 a = !b 中,Java 会先计算 !b,再将这个布尔结果赋给 a。同一个赋值表达式也可以出现在 if 条件中:条件接收赋给变量的布尔值,该值为 true 时就会执行代码块。这种写法是合法的,但它会在检查条件时改变 a;如果不需要赋值,直接写 if (!b) 往往更容易理解。

赋值运算的优先级低于一元取反,因此该表达式按 a = (!b) 分组。赋值表达式本身也有布尔值,其结果就是刚存入 a 的值。因此,Java 接受它作为 if 的条件;这里的条件并没有将 a 与另一个值进行比较。如果赋值是有意为之,这种写法可能很方便,但容易让人误以为进行了比较。如果既要保存一个值,又要单独进行测试,可以先赋值,再用另一条语句进行测试,让这两个操作一目了然。

public class Main {
  public static void main(String[] args) {
    boolean a;
    boolean b = true;
    a = !b;
    System.out.println("a = " + a);

    b = false;
    if (a = !b) {
      System.out.println("condition is true; a = " + a);
    }
  }
}
a = false
condition is true; a = true

当 b 为 true 时,!b 为 false,这个值会被赋给 a。之后,当 b 为 false 时,条件中的赋值会将 true 存入 a;这个 true 值会使 if 代码块执行。将表达式写成 a = !b,可以更清楚地区分赋值和取反,但空格不会改变表达式的含义。