我在这里遇到一些奇怪的事情.如果我遗失了什么,请帮助我理解.我的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)来避免这种拼写错误更安全.
赋值是一个表达式,它返回您指定的值.例如a = b = true将分配true给a和b.
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)
一个赋值表达式的结果始终是被分配,分配到布尔值时包括值.这由JLS§15.26涵盖:
在运行时,赋值表达式的结果是赋值发生后变量的值.
所以是的,configuredPdf = true分配true给configuredPdf,表达式的结果是true.
类似地,x = y = 5;分配5给y,并且结果y = 5是5,然后将其分配给x.
从根本上说,你想要的是:
if (configuredPdf)
Run Code Online (Sandbox Code Playgroud)
从来没有必要将布尔变量与trueor 进行比较false,只需使用if (theVariable)(用于比较true)或if (!theVariable)(用于比较false).养成这种习惯可以保护你免受无意的任务.
实际比较布尔值的唯一时间是有用的,因为它们都是变量,例如if (thisFlag == thatFlag)或者if (thisFlag != thatFlag).
为避免在这种情况下意外分配,要么:
使用检查这个的linter
"双爆"第一面旗帜:
if (!!thisFlag == thatFlag)
Run Code Online (Sandbox Code Playgroud)
...虽然正如你所指出的那样你是否可能不小心打字=而不是==,大概是你可以不小心打字!而不是!!:-)
使用旧的C语言(这是我使用的):
if (!thisFlag == !thatFlag)
Run Code Online (Sandbox Code Playgroud)