【问题标题】:Getting confused with == and = in "if" statement对“if”语句中的 == 和 = 感到困惑
【发布时间】:2011-01-24 12:55:47
【问题描述】:

我知道我们不能像在其他几种语言中使用的那样在 java 中的 if 语句中使用赋值运算符。

那是

            int a;

            if(a = 1) {  } 

会报编译错误。

但是下面的代码可以正常工作,怎么样?

           boolean b;

           if(b = true) {   }

编辑:这是规则不能在 if 语句中使用赋值的例外情况。

【问题讨论】:

  • 养成在 if 语句中将常量放在首位的习惯并不是一个坏主意......即:if (true == b) {} 和 if (1 == a ) {} 这个习惯保证如果你写 = 而不是 ==,编译器会打你。
  • @Ollie:对此的看法大相径庭。就可读性而言,这是个坏主意。此外,它在 Java 等语言中没有任何好处,因为这里不会出现混淆。我的意思是,从来没有人用if (a == true) 写过测试,对吧?
  • @Konrad。你在 Java 中是对的,但是对于这个使用 PERL 和其他一些语言的 C 翻新,它为我节省了很多次。
  • 在很多情况下都不起作用,例如if ( $a == $b )。读起来很糟糕,没有人说“5 是一个”。在编写if 条件时更加小心,IMO 更容易。
  • @Ollie 现在大多数编译器都有一个选项,如果你写 if(foo = x) 或类似的东西会警告你。

标签: java compiler-errors scjp


【解决方案1】:

因为赋值的“结果”是赋值......所以在第二种情况下它仍然是boolean 表达式。 if 表达式要求条件是 boolean 表达式,第二个满足但第一个不满足。实际上,您的两个 sn-ps 是:

int a;

a = 1;
if (a) { }

和

boolean b;

b = true;
if (b) { }

从那个扩展中可以清楚地看出第二个版本会编译而不是第一个版本吗?

这是不直接比较真假的原因之一。所以我总是写if (b)而不是if (b == true)和if (!b)而不是if (b == false)。当b 和c 是boolean 变量时,你仍然会遇到if (b == c) 的问题,诚然——那里的错字可能会导致问题。不过我不能说它曾经发生在我身上。

编辑:响应您的编辑 - 可以在 if 语句和 while 循环等中使用各种赋值,只要整体条件表达式为 boolean。例如,您可能有:

String line;
while ((line = reader.readLine()) != null)
{
    // Do something with a line
}

虽然我通常避免条件中的副作用,但这个特殊的习惯用法通常对于上面显示的示例或使用InputStream.read 很有用。基本上是“当我读到的值有用时,使用它。”

【讨论】:

  • 你确定最后一个例子中多了一对括号吗?我认为赋值在 Java 中具有最后的优先级...
  • @Carlos:很好的收获。也许我已经习惯了故意把它放进去,我从来没有试过没有:)
  • 我通常会根据迭代器的 hasNext 和 next 方法来考虑这个习惯用法(并在类比合适时使用它)——它基本上是为那些不是明确的迭代器的东西实现了这些方法的组合(我当然希望读者在以后的版本中添加了该接口的实现)。
  • 此外,在某些语言(C、C++)中,可以用整数代替布尔值,其中 0 为假,非 0 为真。这大大增加了 =/== 错误的机会。
  • @mtruesdell:确实,尽管我相信大多数 C 和 C++ 编译器都会警告你,除非你有一对额外的括号来强调这是故意的......至少如果你有足够高的警告出现.
【解决方案2】:

对于 if,您需要一个计算结果为 boolean 的表达式。 b = true 评估为 boolean,但 a = 1 评估为 int,因为赋值总是评估为分配的值。

【讨论】:

    【解决方案3】:

    第二个代码正常工作的原因是因为它为'b'分配了真值,然后比较b是真还是假。您可以这样做的原因是因为您可以在 if 语句中执行赋值运算符,并且您可以单独与布尔值进行比较。和 if(true) 一样。

    【讨论】:

      【解决方案4】:

      在 java 中,您没有隐式转换。所以非布尔值或不会自动转换为布尔值。

      在第一种情况下,语句的结果是一个 int,它是非布尔值,这将不起作用。最后一种情况,结果是布尔值,可以在 if 语句中求值。

      【讨论】:

        【解决方案5】:

        规则不是“赋值不能在if 语句中使用”,而是“if 语句中的条件必须是boolean 类型”。赋值表达式会产生一个被赋值类型的值,因此 Java 只允许在分配 boolean 值时在 if 语句中进行赋值。

        这就是为什么应该避免使用 if (foo == true) 样式的一个很好的理由,而应该简单地写成 if (foo)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多