=和== 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
将为a
和b
赋值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 = true
为configuredPdf = true
指定true
,并且该表达式的结果为true
。
同样, x = y = 5;
将y
分配为5
, y = 5
的结果为5
,然后将其分配给x
。
从根本上说,你想要的是:
if (configuredPdf)
从来没有必要将布尔变量与true
或false
进行比较,只需使用if (theVariable)
(用于与true
进行比较)或if (!theVariable)
(用于与false
进行比较)。 养成这种习惯可以保护你免受无意中的任务。
实际比较布尔值的唯一时间是有用的,因为它们都是变量,例如if (thisFlag == thatFlag)
或if (thisFlag != thatFlag
)。
为避免在这种情况下意外分配,要么:
-
使用检查这一点的linter
-
“双爆”第一面旗帜:
if (!!thisFlag == thatFlag)
…虽然你指出如果你不小心输入
=
而不是==
,大概你可能会意外输入!
而不是!!
🙂 -
使用旧的C语言(这是我使用的):
if (!thisFlag == !thatFlag)
发生的事情是当编译器进入代码中的if条件时,它会将’configuredpdf’指定为true。 因此条件
if(configuredpdf = true)
变为true并且循环执行成功。 但是,当我们不希望这个循环成立时,问题就出现了。 那时,对于给定的输入,编译器解析if条件,它强制变为真,并且即使输入的数据不一致,也执行条件执行时写入的代码。 这就是为什么你会发现你的代码在if条件下有bug。
configuredPdf
必须是if(configuredPdf = true)
才能编译的布尔值。
configuredPdf = true
将为configuredPdf = true
赋值true
,因此if
成功。