=和== If语句中的差异Java

Kum*_*mar 4 java if-statement

我在这里遇到一些奇怪的事情.如果我遗失了什么,请帮助我理解.我的if条件应该是:

if(configuredPdf == true)
Run Code Online (Sandbox Code Playgroud)

但是我错误地写道:

if(configuredPdf = true)
Run Code Online (Sandbox Code Playgroud)

我的Eclipse编译器不会要求我纠正它.然后我假设没有编译时间或检查异常.所以:

(configuredPdf = true)
Run Code Online (Sandbox Code Playgroud)

返回一个布尔值?

Era*_*ran 12

是的,configuredPdf = true分配true给您的变量并返回true.因此它if (configuredPdf = true)是一种有效的语法,即使它通常是一个错误.

使用它if (configuredPdf)来避免这种拼写错误更安全.


Pet*_*rey 8

赋值是一个表达式,它返回您指定的值.例如a = b = true将分配trueab.

boolean添加原因类型是为了避免这种错误.以C为例,你可以写

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

任何非负面的都是真的.

虽然你仍然可以用布尔类型犯错,而不是写

if (a == true)
if (b == false)
Run Code Online (Sandbox Code Playgroud)

你可以写

if (a)
if (!b)
Run Code Online (Sandbox Code Playgroud)

一个更常见的例子是

for(String line; ((line = br.readLine()) != null;) {
    // process the line.
}
Run Code Online (Sandbox Code Playgroud)


T.J*_*der 5

一个赋值表达式的结果始终是被分配,分配到布尔值时包括值.这由JLS§15.26涵盖:

在运行时,赋值表达式的结果是赋值发生后变量的值.

所以是的,configuredPdf = true分配trueconfiguredPdf,表达式的结果是true.

类似地,x = y = 5;分配5y,并且结果y = 55,然后将其分配给x.

从根本上说,你想要的是:

if (configuredPdf)
Run Code Online (Sandbox Code Playgroud)

从来没有必要将布尔变量与trueor 进行比较false,只需使用if (theVariable)(用于比较true)或if (!theVariable)(用于比较false).养成这种习惯可以保护你免受无意的任务.

实际比较布尔值的唯一时间是有用的,因为它们都是变量,例如if (thisFlag == thatFlag)或者if (thisFlag != thatFlag).

为避免在这种情况下意外分配,要么:

  1. 使用检查这个的linter

  2. "双爆"第一面旗帜:

    if (!!thisFlag == thatFlag)
    
    Run Code Online (Sandbox Code Playgroud)

    ...虽然正如你所指出的那样你是否可能不小心打字=而不是==,大概是你可以不小心打字!而不是!!:-)

  3. 使用旧的C语言(这是我使用的):

    if (!thisFlag == !thatFlag)
    
    Run Code Online (Sandbox Code Playgroud)