在"if"语句中与==和=混淆

Gur*_*lki 12 java scjp compiler-errors

我知道我们不能在java中的if语句中使用赋值运算符,因为我们在其他几种语言中使用它.

那是

            int a;

            if(a = 1) {  } 
Run Code Online (Sandbox Code Playgroud)

会给出编译错误.

但是下面的代码工作得很好,怎么样?

           boolean b;

           if(b = true) {   }
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个例外,规则不能在if语句中使用赋值.

Jon*_*eet 39

因为赋值的"结果"是赋值的值...所以它仍然是boolean第二种情况下的表达式.if表达式要求条件是一个boolean表达式,它由第二个而不是第一个表达式满足.实际上,您的两个片段是:

int a;

a = 1;
if (a) { }
Run Code Online (Sandbox Code Playgroud)

boolean b;

b = true;
if (b) { }
Run Code Online (Sandbox Code Playgroud)

从扩展中可以清楚地知道第二个版本将编译而不是第一个版本吗?

这是不直接与真假比较的一个原因.所以,我总是只写if (b)代替if (b == true)if (!b)代替的if (b == false).你仍然可以得到与问题if (b == c),当bcboolean变量,诚然-一个错字有可能会导致一个问题.我不能说它曾经发生在我身上.

编辑:响应您的编辑 - 所有类型的分配可以在if语句 - 和while循环等中使用,只要整体条件表达式是boolean.例如,您可能有:

String line;
while ((line = reader.readLine()) != null)
{
    // Do something with a line
}
Run Code Online (Sandbox Code Playgroud)

虽然我通常避免在条件中产生副作用,但这个特定的习惯用法通常对上面显示的例子或使用有用InputStream.read.基本上它是"虽然我读的价值很有用,但要使用它."

  • 你确定在最后一个例子中有一对额外的括号吗?我认为作业在Java中具有最后的优先级...... (3认同)
  • @Carlos:好抓.也许我已经习惯于故意把它放进去,我从来没有试过没有:) (2认同)

Gum*_*mbo 10

因为if你需要一个求值为boolean的表达式.b = trueevalueates to booleana = 1计算结果为int,因为赋值始终计算为指定的值.