Java中while(x = false)和while(!x)之间有什么区别?

对不起,我是Java的新手,所以这个问题可能不清楚。

我最近一直在处理在while循环中包含try和catch语句,因为我想确保从程序的其余部分包含输入。

我遇到过一个问题,在while条件下在变量前面使用感叹号(!)(例如while(!done))而不是使用= false(例如while(done = false))改变了我的程序方式运行。

前者(!done)导致try和except语句按预期运行。 后者(done = false)不会,只是跳过它们并转到代码的下一部分。

我的印象是! 在变量意味着与var = false相同之前。

我错了吗?

这是一个例子:

import java.util.Scanner; public class TestOne { public static void main(String args[]) { Scanner input = new Scanner(System.in); int num; boolean inputDone = false; while (!inputDone) { try { System.out.print("Enter in a number here: "); num = input.nextInt(); inputDone = true; } catch (Exception e) { System.out.println(e); System.exit(0); } } System.out.println("Success!"); } } 

目前,编译和运行程序将顺利进行:它将提示我输入一个数字,输入一个字母或真正的长数字会导致它打印出exception类型并退出。 输入正常数字会导致打印成功!

另一方面,如果我用inputDone = false替换!inputDone,它只会打印出Success! 当我运行程序时。

任何人都可以解释我之间的区别! 和while循环中的= false语句?

注意done = falsedone == false之间的区别。 第一个 done指定为false并将其评估为false ,第二个将falsefalse进行比较done!done完全相同。

所以如果你使用:

 while (done = false) { // code here } 

然后将done设置为false并且while循环中的代码根本不运行。

语句x = false是一个赋值 – 您将x设置为false。 但是,语句x == false!x是相同的。 语句x == false将x与x == false进行比较,如果x值为false,则为true;如果x值为true,则为false。 语句!x将导致x值的否定。

在您的代码中,如果使用while(inputDone == false)替换while (!inputDone) while(inputDone == false) ,您将获得预期的行为。

您需要使用==而不是=进行比较。

“while(done = false)”等于“done = false; while(done)”

它应该写成“while(done == false)”或“while(false == done)”。

但仍然,!done是最易读的代码,它说“没有完成”

正如许多其他人所指出的那样,你已经错了== 。 更有趣的是围绕这个问题。

对于设计的语言:在表达式中鼓励副作用是不好的。 使用符号==来表示数学=不是一个好的选择。

在可读性方面, !done读取要比做得好得多done == false – 我们希望“未完成”(更好的是,IMO,将“直到完成”而不是“未完成”)。 虽然(永久)新手经常写冗余someCondition == true

将变量设为final是一个好主意,尽管在这种情况下显然不可行。 但是,我们可以使用break语句完全删除该标志。 少数意见遵循单一条目单一退出(SESE)规则,其中禁止break ,这将使此示例更棘手(您需要测试以查看文本是否是有效的int ,或者在这种情况下,移动身体进入循环。

表达方式:

 x = false 

表示将x赋值为false

在你的while()发生这种情况后,它会评估x ,这是false所以它根本不进入循环。

另一方面:

 while (!x) 

意思是“只要!x为真,继续进入循环”。 因为!x表示“与x相反”。 因此只要x为假,循环就会继续

其他答案提到了写x == falsex == true是坏风格的x == true 。 这有三个原因:

  • 简洁性:假设您处于需要布尔值的上下文中,并且“x”是布尔值,则写入x字符x少于x == true!x不是x == false
  • 惯例:使用Java(或C,C ++,C#和大多数其他语言)的经验丰富的程序员希望看到x而不是x == true!x而不是x == false
  • 鲁棒性:在Java中,条件语句和循环语句都需要条件中的布尔值表达式。 如果y不是布尔值,那么forms为if (y = foo) {的拼写错误将在Java中产生编译错误。 但是如果y是布尔值,那么if (y = foo) {不会给出编译错误。 因此,通过避免==对于布尔人来说,你可以避免让自己陷入因拼写错误导致的大量错误。

许多人已经指出你滥用= vs. == 。 我想指出运行像Findbugs这样的静态代码分析工具会立即为您找到这个。

请参阅QBA:Method在布尔表达式中指定布尔文字