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

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

if(configuredPdf == true) 

但是我写错了:

 if(configuredPdf = true) 

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

 (configuredPdf = true) 

返回一个布尔值?

是的, configuredPdf = true为您的变量赋值true并返回true 。 因此, if (configuredPdf = true)是一个有效的语法,即使它通常是一个错误。

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

赋值是一个表达式,它返回您指定的值。 例如a = b = true将为ab赋值true

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

 if (a = 1) 

任何非负面的都是真的。

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

 if (a == true) if (b == false) 

你可以写

 if (a) if (!b) 

一个更常见的例子是

 for(String line; ((line = br.readLine()) != null;) { // process the line. } 

赋值表达式的结果始终是分配的值,包括分配给布尔值时的值。 这由JLS§15.26涵盖:

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

所以是的, configuredPdf = trueconfiguredPdf = true指定true ,并且该表达式的结果为true

同样, x = y = 5;y分配为5y = 5的结果为5 ,然后将其分配给x

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

 if (configuredPdf) 

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

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

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

  1. 使用检查这一点的linter

  2. “双爆”第一面旗帜:

     if (!!thisFlag == thatFlag) 

    …虽然你指出如果你不小心输入=而不是== ,大概你可能会意外输入! 而不是!! 🙂

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

     if (!thisFlag == !thatFlag) 

发生的事情是当编译器进入代码中的if条件时,它会将’configuredpdf’指定为true。 因此条件

  if(configuredpdf = true) 

变为true并且循环执行成功。 但是,当我们不希望这个循环成立时,问题就出现了。 那时,对于给定的输入,编译器解析if条件,它强制变为真,并且即使输入的数据不一致,也执行条件执行时写入的代码。 这就是为什么你会发现你的代码在if条件下有bug。

configuredPdf必须是if(configuredPdf = true)才能编译的布尔值。

configuredPdf = true将为configuredPdf = true赋值true ,因此if成功。