Java 当我们使用赋值而不是比较时,如何计算if/while条件?
在学习OCA/OCP for Java时,我发现了这个令人惊讶的事情 下面是if(测试条件)部分的第一段代码 让我惊讶Java 当我们使用赋值而不是比较时,如何计算if/while条件?,java,if-statement,Java,If Statement,在学习OCA/OCP for Java时,我发现了这个令人惊讶的事情 下面是if(测试条件)部分的第一段代码 让我惊讶 public class BooleanIf { public static void main(String[] args) { boolean b = false; System.out.println(Boolean.valueOf(b = true)); if (b = true) System.out.println("true
public class BooleanIf {
public static void main(String[] args) {
boolean b = false;
System.out.println(Boolean.valueOf(b = true));
if (b = true)
System.out.println("true");
else
System.out.println("false");
}
现在,这一结果令人惊讶地是“真实的”
我了解到,必须有一个返回true或false的关系条件,就像if(a>b)
或if(a!=b)
一样
我想知道这件事是如何变为现实的。它是否调用Boolean.valueOf()?这不是一个很好的做法
Boolean.valueOf(b=true),
现在关于这个问题,您应该避免这样做>
如果(b=true)
与
b = true;
if (b)
因此,条件总是满足的
与此类似
if (b = false)
永远不会被处决
其他信息:
这种类型的打字错误通常是由初级开发人员造成的
在发展史上,有人提出了解决方案
所谓的约达条件(像《星球大战》中的大师约达那样称呼…)
因此,在这种情况下,JODA条件是安全的,因为您可以尝试:
if (true = b) {
// code here
}
但这不会编译,因为投诉:
赋值的左侧必须是变量
关于这个想法有多好,代码是否更易于阅读,等等,争议仍然存在。这不是一个很好的实践
Boolean.valueOf(b=true),
现在关于这个问题,您应该避免这样做>
如果(b=true)
与
b = true;
if (b)
因此,条件总是满足的
与此类似
if (b = false)
永远不会被处决
其他信息:
这种类型的打字错误通常是由初级开发人员造成的
在发展史上,有人提出了解决方案
所谓的约达条件(像《星球大战》中的大师约达那样称呼…)
因此,在这种情况下,JODA条件是安全的,因为您可以尝试:
if (true = b) {
// code here
}
但这不会编译,因为投诉:
赋值的左侧必须是变量
关于这个好主意的争议仍然悬而未决,代码是否更易于阅读,等等。
=
是赋值运算符,=
是比较运算符
但是
不仅将y
中的值赋给变量x
,而且还返回该值
正因为如此,我们可以做一些事情,比如x=(y=1)
(我们甚至可以在这里放上括号),将1
赋值给变量y
,然后返回1
,并将其赋值给x
因此,也可以编写类似于if(b=true)
的代码,其中true
将被分配给b
,然后由if(…)
返回并使用。换句话说,如果(true){b=true;.}那么它将始终从true
分支执行代码
如何避免这种打字错误?
- 省略
和==true
部分==false
- 在
的情况下,我们可以编写if(b==true)
,因为if(b)
将始终给出与(b==true)
中存储的aleady相同的结果b
- 在
的情况下,我们可以编写if(b==false)
if(!b)
- 在
- 在
的左侧使用值而不是变量==
换句话说,如果(true==b){..},则使用。即使我们错误地编写了
而不是=
,我们最终将得到=
,这将导致编译错误,因为我们无法为true=b
这样的值赋值。我们只能给变量赋值true
=
是赋值运算符,=
是比较运算符
但是
不仅将y
中的值赋给变量x
,而且还返回该值
正因为如此,我们可以做一些事情,比如x=(y=1)
(我们甚至可以在这里放上括号),将1
赋值给变量y
,然后返回1
,并将其赋值给x
因此,也可以编写类似于if(b=true)
的代码,其中true
将被分配给b
,然后由if(…)
返回并使用。换句话说,如果(true){b=true;.}那么它将始终从true
分支执行代码
如何避免这种打字错误?
- 省略
和==true
部分==false
- 在
的情况下,我们可以编写if(b==true)
,因为if(b)
将始终给出与(b==true)
中存储的aleady相同的结果b
- 在
的情况下,我们可以编写if(b==false)
if(!b)
- 在
- 在
的左侧使用值而不是变量==
换句话说,如果(true==b){..},则使用。即使我们错误地编写了
而不是=
,我们最终将得到=
,这将导致编译错误,因为我们无法为true=b
这样的值赋值。我们只能给变量赋值true
如果
需要布尔型表达式
布尔变量的类型为。。。布尔型
那么,如果将布尔变量放在if后面,可能会发生什么呢?
if
需要布尔类型的表达式
布尔变量的类型为。。。布尔型
那么,如果将布尔变量放在if后面,可能会发生什么情况呢?让我们从查看
if
语句的结构开始:
if ( <boolean-expression> ) {
...
}
接下来,让我们看一看
if (b = list.isEmpty()) {
...
}