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

What is the difference between while (x = false) and while (!x) in Java?

提问人:akbiggs 提问时间:9/20/2009 最后编辑:dplanteakbiggs 更新时间:5/25/2012 访问量:22163

问:

对不起,我是 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!");
    }
}

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

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

谁能向我解释一下 !和 while 循环中的 = false 语句?

java try-catch while-循环

评论

0赞 starblue 9/21/2009
x == false 是糟糕的风格,几乎和 x == true 一样糟糕。
0赞 Pete Kirkham 1/12/2010
我喜欢问题标题中的错别字是从不写的原因lvalue == false

答:

4赞 Thomas Owens 9/20/2009 #1

该语句是一个赋值 - 您将 x 设置为 false。但是,这些陈述是相同的。该语句将 x 与 false 进行比较,如果 的值为 false,则为 true,如果 的值为 true,则为 false。该语句将导致 的值是否定。x = falsex == false!xx == falsexx!xx

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

评论

0赞 akbiggs 9/20/2009
哦,哈哈。哇,我简直不敢相信我错过了。谢谢!
17赞 Joren 9/20/2009 #2

请注意 和 之间的区别。第一个赋值为 be 并计算为 ,第二个与 进行比较,并且与 完全相同。done = falsedone == falsedonefalsefalsedonefalse!done

因此,如果您使用:

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

然后设置为,while 循环中的代码根本不会运行。donefalse

评论

0赞 akbiggs 9/20/2009
谢谢。这是最近我忘记第二个感叹号的第二个错误。
3赞 Stephen C 9/21/2009
@Mana:如果你摆脱了将布尔值与“==”显式比较的(坏)习惯,你就不会犯这个错误。
2赞 Mike 9/20/2009 #3

表达式:

x = false

表示赋值。xfalse

在 中发生这种情况后,它会进行评估,因此它根本不会进入循环。while()xfalse

另一方面:

while (!x)

表示“只要 !x 为 true,就继续进入循环”。因为意味着“X的反面”。因此,只要是假的,循环就会继续!xx

2赞 Dennis C 9/20/2009 #4

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

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

但是,!done 仍然是最易读的代码,它说“NOT DONE”

评论

0赞 Thorbjørn Ravn Andersen 9/21/2009
写“while (done == false) ...”最适合我。我倾向于忽略那些讨厌的感叹号。
3赞 João Silva 9/20/2009 #5

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

2赞 Tom Hawtin - tackline 9/21/2009 #6

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

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

在可读性方面,读起来比 - 我们想要“未完成”(更好的是,IMO,应该是“直到完成”而不是“未完成”)。虽然(永久的)新手经常写多余的.!donedone == falsesomeCondition == true

制作变量是个好主意,尽管在这种情况下显然不可行。但是,我们可以通过使用 break 语句完全删除该标志。少数人的意见遵循单次进入单次退出 (SESE) 规则,即被禁止,这将使这个例子更加棘手(你需要一个测试来查看文本是否有效,或者在这种情况下,将正文移动到循环中。finalbreakint

1赞 Stephen C 9/21/2009 #7

其他答案暗示了这样一个事实,即写作和风格不好。这有三个原因:x == falsex == true

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

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

请参阅 QBA:方法在布尔表达式中分配布尔文本