Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在if语句中更改布尔值?_Java_Boolean_Conditional - Fatal编程技术网

Java 在if语句中更改布尔值?

Java 在if语句中更改布尔值?,java,boolean,conditional,Java,Boolean,Conditional,我正在为OCA Java SE7联合考试学习。我的一个练习试题包含以下代码片段: boolean flag = true; if (flag = false) { System.out.println("1"); } else if (flag) { System.out.println("2"); } else if (!flag) { System.out.println("3"); } else System.out.println("4"); 注意if(

我正在为OCA Java SE7联合考试学习。我的一个练习试题包含以下代码片段:

boolean flag = true;
if (flag = false) {
    System.out.println("1");
}
else if (flag) {
    System.out.println("2");
}
else if (!flag) {
    System.out.println("3");
}
else
    System.out.println("4");
注意
if(flag=false)
条件。问题是这个片段的输出是什么。所有数字都作为答案选项提供,然后有一个选项写着“编译器错误”,这就是我选择的。我错了。输出为3。我在Eclipse中进行了测试,它也返回了3

然后我测试了一下

int x = 3;
int y = 1;
if (x = y) {
   // whatever
}
当然,还有一个错误


为什么
if语句
中的
标志
可以从
true
更改为
false
,但在类似情况下x的值不能更改?是因为
标志
是布尔类型,而x是类型
int
?我在谷歌上搜索了这个,但什么也找不到

flag=false是一个赋值,因此它被执行。在对第一个if赋值之后,它的计算结果为false,因为它刚刚被设置为false。对于equality,它应该是flag==false,但由于它是一个赋值,top if的计算结果为false,并且由于它在到达时被更改为false!flag,由于flag不再为true而通过,它将打印3

if(x=y)出现错误,因为赋值后,该值不能作为布尔结果计算,而if(flag=false)可以在赋值后计算为布尔值


高级语言需要记住的一件大事是,即使是一个简单的if,也需要不止一个低级语句来执行逻辑,在赋值情况下,至少有两个操作在进行,首先是赋值,然后是等式。

,因为
x=y
的赋值不等于
布尔值

如果
希望操作结果给出
true
false
返回

类似于
if((x=y)==y)
可以工作(计算将返回
true

if(flag=false)
flag
变量设置为false,然后检查
if(flag)


您建议执行
if(x=1)
,它可以将
x
设置为1,但是
if(x)
无效。

它将打印
3
,因为布尔变量被赋值
false
(并检查为true),然后检查为false,最后检查为
!false
这是
true

同样,这是一种好的做法吗?除了为这次考试学习之外,我从未见过它。@NojoRu不,这是一种非常糟糕的做法,人们阅读(可能还有打字)它会认为它是
=
。事实上,许多静态分析器,如FindBugs,都会将此标记为错误。我希望您会说这是一个糟糕的做法。有点让我想知道为什么它会出现在考试上;仅仅因为它可以做到并不意味着它应该做到。@NojoRu它在考试中,因为它强调了犯这种错误是多么容易,并确保你正在阅读(和理解)代码。我经常看到它用于阅读输入,如在
中((line=bufferedReader.readLine())!=null){…