提问人:akbiggs 提问时间:9/20/2009 最后编辑:dplanteakbiggs 更新时间:5/25/2012 访问量:22163
Java 中的 while (x = false) 和 while (!x) 有什么区别?
What is the difference between while (x = false) and while (!x) in Java?
问:
对不起,我是 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 语句?
答:
该语句是一个赋值 - 您将 x 设置为 false。但是,这些陈述是相同的。该语句将 x 与 false 进行比较,如果 的值为 false,则为 true,如果 的值为 true,则为 false。该语句将导致 的值是否定。x = false
x == false
!x
x == false
x
x
!x
x
在代码中,如果将 替换为 ,则将获得预期的行为。while (!inputDone)
while(inputDone == false)
评论
请注意 和 之间的区别。第一个赋值为 be 并计算为 ,第二个与 进行比较,并且与 完全相同。done = false
done == false
done
false
false
done
false
!done
因此,如果您使用:
while (done = false)
{
// code here
}
然后设置为,while 循环中的代码根本不会运行。done
false
评论
表达式:
x = false
表示赋值。x
false
在 中发生这种情况后,它会进行评估,因此它根本不会进入循环。while()
x
false
另一方面:
while (!x)
表示“只要 !x 为 true,就继续进入循环”。因为意味着“X的反面”。因此,只要是假的,循环就会继续!x
x
“while(done = false)” 等于 “done=false;while(完成)”
它应该写成“while(done == false)”或“while(false == done)”。
但是,!done 仍然是最易读的代码,它说“NOT DONE”
评论
您需要使用而不是进行比较。==
=
正如许多其他人所指出的那样,您打错了.更有趣的是围绕这个问题的问题。==
对于设计的语言:鼓励表达中的副作用是不好的。使用符号来表示数学不是一个好的选择。==
=
在可读性方面,读起来比 - 我们想要“未完成”(更好的是,IMO,应该是“直到完成”而不是“未完成”)。虽然(永久的)新手经常写多余的.!done
done == false
someCondition == true
制作变量是个好主意,尽管在这种情况下显然不可行。但是,我们可以通过使用 break 语句完全删除该标志。少数人的意见遵循单次进入单次退出 (SESE) 规则,即被禁止,这将使这个例子更加棘手(你需要一个测试来查看文本是否有效,或者在这种情况下,将正文移动到循环中。final
break
int
其他答案暗示了这样一个事实,即写作和风格不好。这有三个原因:x == false
x == true
- 简洁性:假设您处于需要布尔值的上下文中,并且“x”是布尔值,则要编写的字符数比 或 比 少。
x
x == true
!x
x == false
- 惯例:Java(或C,C++,C#和大多数其他语言)经验丰富的程序员希望看到而不是,而不是。
x
x == true
!x
x == false
- 鲁棒性:在 Java 中,条件语句和循环语句都需要在条件中使用布尔值表达式。如果不是布尔值,那么表单的拼写错误将在 Java 中产生编译错误。但是,如果是布尔值,则不会给出编译错误。因此,通过避免使用布尔值,您可以避免因拼写错误而导致的大量错误。
y
if (y = foo) {
y
if (y = foo) {
==
许多人已经指出了你对 vs. 的误用。我想指出的是,运行像 Findbugs 这样的静态代码分析工具会立即为您找到它。=
==
评论
lvalue == false