我在这里遇到一些奇怪的事情。如果我遗失了什么,请帮助我理解。我的if条件应该是:
if(configuredPdf == true)
但是我写错了:
if(configuredPdf = true)
我的Eclipse编译器没有要求我纠正它。然后我假设没有编译时间或检查异常。所以:
(configuredPdf = true)
返回一个布尔值?
答案 0 :(得分:12)
是的,configuredPdf = true
会为您的变量指定true
并返回true
。因此,if (configuredPdf = true)
是一种有效的语法,即使它通常是一个错误。
使用if (configuredPdf)
来避免这种拼写错误更安全。
答案 1 :(得分:8)
赋值是一个表达式,它返回您指定的值。例如a = b = true
会将true
分配给a
和b
。
添加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.
}
答案 2 :(得分:5)
赋值表达式的结果始终是分配的值,包括分配给布尔值时的值。这由JLS§15.26
涵盖在运行时,赋值表达式的结果是赋值发生后变量的值。
是的,configuredPdf = true
将true
分配给configuredPdf
,该表达式的结果为true
。
同样,x = y = 5;
将5
分配给y
,y = 5
的结果为5
,然后将其分配给x
。
从根本上说,你想要的是:
if (configuredPdf)
从来没有必要将布尔变量与true
或false
进行比较,只需使用if (theVariable)
(与true
进行比较)或{{ 1}}(用于与if (!theVariable)
进行比较)。养成这种习惯可以保护你免于意外分配。
实际比较布尔值的唯一时间是有用的是当它们两个变量时,例如false
或if (thisFlag == thatFlag)
)。
为避免在这种情况下意外分配,请:
使用检查此内容的linter
" double bang"第一面旗帜:
if (thisFlag != thatFlag
...虽然正如您所指出的那样,如果您不小心输入if (!!thisFlag == thatFlag)
而不是=
,可能您可能会意外地输入==
而不是!
: - )< / p>
使用旧的C语言(这是我使用的):
!!
答案 3 :(得分:1)
当编译器进入代码中的if条件时,它会将'configuredpdf'指定为true。因此条件
if(configuredpdf = true)
变为true并且循环执行成功。但是,当我们不希望这个循环成立时,问题就出现了。那时,对于给定的输入,编译器解析if条件,它强制变为true,并且即使输入的数据不一致,也执行条件执行时写入的代码。这就是为什么你会发现你的代码在if条件下有错误。
答案 4 :(得分:0)
configuredPdf
必须是if(configuredPdf = true)
编译的布尔值。
configuredPdf = true
会将true
分配给configuredPdf
,因此if
会成功。