3

抱歉,我是 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 = false 替换 !inputDone,它只会打印出 Success!当我运行程序时。

谁能解释一下两者之间的区别!和 while 循环中的 = false 语句?

4

8 回答 8

17

done = false注意和之间的区别done == false。第一个赋值 done为 befalse并评估为false,第二个比较donefalse完全相同!done

因此,如果您使用:

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

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

于 2009-09-20T14:36:28.947 回答
4

该语句x = false是一个赋值 - 您将 x 设置为 false。然而,陈述x == false!x是相同的。该语句x == false将 x 与 false 进行比较,如果值为xfalse,则为 true,如果值为xtrue,则为 false。该语句!x将导致 的值的否定x

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

于 2009-09-20T14:36:13.697 回答
3

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

于 2009-09-20T14:37:53.007 回答
2

表达方式:

x = false

表示x赋值false

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

另一方面:

while (!x)

表示“只要 !x 为真,继续进入循环”。因为!x意思是“x的反面”。所以只要x是假的,循环就会继续

于 2009-09-20T14:37:25.623 回答
2

"while(done = false)" 等于 "done=false; while(done)"

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

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

于 2009-09-20T14:37:47.417 回答
2

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

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

就可读性而言,!done读起来要好得多done == false——我们想要“未完成”(更好的是,IMO 将是“直到完成”而不是“未完成”)。尽管(永久)新手经常写多余的someCondition == true.

制作 variables 是个好主意final,尽管在这种情况下显然不可行。但是,我们可以使用 break 语句完全删除标志。少数意见遵循 Single Entry Single Exit (SESE) 规则,break即被禁止,这会使这个示例更加棘手(您需要测试文本是否有效int,或者在这种情况下,将正文移动到循环。

于 2009-09-20T16:19:07.527 回答
1

其他答案暗示了写作风格不好x == false的事实。x == true这有三个原因:

  • 简洁性:假设您处于需要布尔值的上下文中,并且“x”是布尔值,则要写入的字符少于x,x == true或。!xx == false
  • 约定:Java(或 C、C++、C# 和大多数其他语言)经验丰富的程序员希望看到x而不是x == true!x而不是x == false.
  • 鲁棒性:在 Java 中,条件和循环语句都需要条件中的布尔值表达式。如果y不是布尔值,则表单的拼写错误if (y = foo) {将在 Java 中产生编译错误。但是 if yis a Boolean thenif (y = foo) {不会给出编译错误。因此,通过避免==使用布尔值,您可以避免为拼写错误导致的大量错误设置自己。
于 2009-09-21T07:04:01.783 回答
0

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

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

于 2012-05-24T21:01:15.157 回答