我在C中有以下代码:
int main() {
int num;
printf("Enter 1, 2 or 3:\n");
scanf("%d", &num);
while(num != 1 || num != 2 || num != 3) {
printf("Try again!\n");
scanf("%d", &num);
}
return 0;
}
无论我输入什么,while循环都不会退出。这段代码出了什么问题?
当我输入num = 3时,while循环应该被评估为false并且不应该执行。但由于某种原因,它仍然是。
你能告诉我我做错了什么吗?
谢谢!
答案 0 :(得分:8)
您的while循环条件错误。您需要使用AND运算符&&
而不是OR运算符||
。当你使用OR运算符时,你会说这些条件是否为真,所以在这种情况下,如果输入不是1或者它不是2或者它不是3,那么你再次进入循环。这意味着输入必须同时等于1,2和3,这是不可能的,因此是无限循环。
我现在已经看过几次这个错误;我认为这是因为人们习惯使用OR来表示“任何”,如果ORed的条件没有被否定,那么它就有效。但是,当你在!(x==2)
这样的否定条件下使用它时,它意味着所有条件(如x==2
)都必须为真。这是DeMorgan的法则,当你有这个形式的布尔表达式时: !x || !y || !z
,它实际上等同于!(x && y && z)
,仅在满足所有三个条件时才计算为false。
答案 1 :(得分:2)
您的条件相交。
您的第一个条件会创建一个除1
之外的每个数字的组。
您的第二个条件是创建一个包含2
的所有数字的组。
根据逻辑规则,使用组时OR
操作数相当于 union ,所以:
( Universe - {1} ) U ( Universe - {2} ) = Universe
基本上,对于前两个条件,您的比较始终为true
。
答案 2 :(得分:1)
使用时||在条件中它意味着:如果任何条件为真,则返回true。 当使用&&在条件中它意味着:如果所有条件都为真,则返回true。
所以你的解决方案是:
while(num != 1 && num != 2 && num != 3)
{
// your code
}
如果num不等于1且不等于2且不等于3,则返回true。