1

我正在为一个班级项目做最后的润色,我正在为我的一个用户输入添加一个安全网。我已经设置好了,如果用户输入“1”或“2”,他们输入的数据将以不同的方式显示。我想添加一种方法来防止用户输入除“1”或“2”以外的任何内容。这是它的代码。

do
{
System.out.println("Please type either '1' or '2'.");
Scanner scan = new Scanner(System.in);
a = scan.nextInt();
}
while (a != (1||2));
//after user enters 1 or 2, return the choice
return a;

我一直在阅读有关操作数和逻辑的信息,但我有点卡住了。我一直在纠缠我的老师,所以我想我应该让他休息一下,因为我不是他唯一的学生。我的错误是“二元运算符'||'的操作数类型错误。

4

8 回答 8

7

这是学习编程时常见的误解。

作为人类,你可以很容易地阅读这样的陈述:“虽然a不是1或2”,但计算机必须遵循一定的规则,其中一个规则是“或”优先。

这意味着它首先试图弄清楚“1 或 2”是什么意思,因为基本上,您的陈述与此类似:

while (a != SOMETHING);

||在Java语言中是“逻辑或”,翻译过来就是:取两边(称为运算符)的两个值(称为操作数)||,按照“逻辑或”的规则组合起来。

“逻辑或”使用两个布尔值,它们只能是 True 或 False,并且由于您要求它使用带有数字的运算符,这就是您收到特定错误消息的原因。

如果您尝试使用单管道 ,|编译器可能已经停止抱怨,但它仍然不会做您希望它做的事情。

1 or 2在处理数字时,使用|运算符,即“按位或”运算符,您可以将两个数字组合成数字 3。如果您想知道原因,可以阅读有关“按位运算符”的更多信息。

简而言之,你不能这样写你的比较。

在编程语言中,一次比较两个值,即。一个对另一个,所以你唯一的选择是扩展表达式来比较两次。

下面是一些等价的表达式,可以满足您的需求:

while (a != 1 && a != 2);

或这个:

while (!(a == 1 || a == 2));

老实说,我更喜欢第一个。

于 2013-02-23T21:09:53.467 回答
0

它是(a != 1 && a!=2)- 当 a 为 1 或 2 时,您实际上想要退出循环。

于 2013-02-23T21:04:40.610 回答
0

您需要为a!= 1和执行单独的条件语句a!= 2

您的条件语句应如下所示:

(a!=1) && (a!=2)
于 2013-02-23T21:04:44.337 回答
0

这里的问题是您正在尝试编写有意义的英文代码,但它不是那样工作的。该||运算符接受两个表达式,如果其中一个是 ,则返回true。这意味着你写的东西没有意义。

替换它的最简单方法是将其扩展:

a != 1 && a != 2

(我们需要使用&&,因为我们正在检查它们都不是真的)。

请注意,这可能会变得冗长和尴尬。或者,一个好的替代品(假设您有很多值要检查)是集合中的成员资格检查(aSet是一个不错的选择,因为您可以保证 O(1) 成员资格测试)。例如:

Set<Integer> possibles = new HashSet<Integer>();
Collections.addAll(possibles, new Integer[] {1, 2, ...});
while (!possibles.contains(a)) {
    ...
于 2013-02-23T21:04:54.557 回答
0

你不能对待一个intlike pseudo- regex。代替

while (a != (1||2));

while (a != 1 && a!= 2);
于 2013-02-23T21:04:58.573 回答
0

在你的while循环条件下试试这个

((a!=1) && (a!=2))
于 2013-02-23T21:05:20.327 回答
0

你必须写

while (a != 1 && a != 2)

因为它相当于not (a == 1 || a == 2)

于 2013-02-23T21:05:34.773 回答
0

二元运算符'||' 两边都需要两个布尔操作数。由于您的操作数是整数,因此这是一个语法错误。

你应该这样做:

do{
// core of the loop...
}while(a!=1 && a!=2);
于 2013-02-23T21:09:31.180 回答