Java Boolean while 循环 - 计算否定

Java Boolean while loop - Evaluating a negation

提问人:anapollosun 提问时间:2/7/2017 最后编辑:anapollosun 更新时间:2/7/2017 访问量:3690

问:

我是 Java 的初学者,虽然我认为我对布尔逻辑的理解相当好,但我被这个 while 循环绊倒了:

boolean done = false;
while(!done) {
    String answer = JOptionPane.showInputDialog(null, "message");

    if (answer == null) finish();

    try {
        sales = Double.parseDouble(answer);
        if (sales<= 0) throw new NumberFormatException();
        else done = true;
    }

我显然读错了,因为代码是有效的,并且是直接取自一本书,但我评估它的方式是:

done = 假,

而 (done = true)

[代码]

否则完成 = true

因此,这似乎会创建一个无限循环(或者根本不启动 while 循环),但事实并非如此。有人可以帮忙解释一下吗?

java while-loop 逻辑布尔 表达式

评论

2赞 Eran 2/7/2017
while(!done)相当于while(done == false)
0赞 Ted Hopp 2/7/2017
您缺少一些代码(至少是 satiment 的 and/or 子句和循环的右括号)。该循环包含 .catchfinallytrywhilewhiletry
1赞 kawaijoe 2/7/2017
布尔值前面的“!”标记反转其原始值。(例如 !true = false)
0赞 anapollosun 2/7/2017
对不起,泰德,这只是完整代码的一小部分。下面有一个 catch 语句,while 循环上有一个括号,更不用说更多方法了。:)

答:

0赞 Lew Bloch 2/7/2017 #1

您错误地将循环条件误读为 ,这与实际含义相反(并且使用了错误的运算符)。您不会将布尔值与布尔值进行比较;从技术上讲,这是一个愚蠢的行为。您也不要在条件表达式中为循环变量赋值,因为这会导致麻烦,并且不是您想要的。while (done = true)

让我们来看看它。

done开始。在条件 中需要一个布尔表达式。布尔表达式的计算结果必须为 to 才能执行循环体。 => 第一次。的值是多少?它!因此,表达式的计算结果为 to 并执行循环体。falsewhile (!done)true!done!false!falsetruetrue

评论

0赞 anapollosun 2/7/2017
很棒的解释。我没有考虑返回的真值:所以然后 while(!done) = while(![true]) = while(false)。而且我也没有意识到 while(false) 条件会停止循环的事实。
0赞 Lew Bloch 2/7/2017
done可以更改值。这是一个变量。因此,评估到在评估时对任何值的否定。所以当是真的,那么是假的。停止循环是 的重点。这在 Java 教程中进行了解释。!donedonedone!donewhile(false)while
3赞 Sweeper 2/7/2017 #2

让我们为有效行提供一些行号:

while(!done) // (1)
{
    String answer = JOptionPane.showInputDialog(null, "message");

    if (answer == null) finish();

    try
    {
        sales = Double.parseDouble(answer); // (2)
        if (sales<= 0) throw new NumberFormatException();
        else done = true; // (3)
    }

(1) 首先执行,是 false,所以是 true,所以 while 循环开始。done!done

(2) 获取用户输入,假设它大于 0,则转到 (3)。

(3) 设置为 true。done

现在,假设代码执行已到达 while 循环的末尾。(1)再次执行。这一次,是真的,所以是假的。如果 while 循环中的条件为 false,则 while 循环将停止迭代,并执行 while 循环正下方的代码。done!done

因此,这似乎会创建一个无限循环

如果您输入大于或等于 0 的数字,则不会出现这种情况。正如我刚才所说,大于 0 的数字将导致 while 循环停止。如果你一直输入负数,就会一直为假,所以一直为真。因此,while 循环永远不会停止。done!done

评论

0赞 anapollosun 2/7/2017
非常感谢!如果条件为假,While 循环不迭代的概念现在很明显,但就我而言,我无法弄清楚。这完全解释了它。
0赞 Sweeper 2/7/2017
@anapollosun如果您认为我的回答回答了您的问题,请考虑通过单击复选标记来接受它