while循环与||无法正常工作

时间:2014-10-14 19:32:33

标签: c while-loop

我在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并且不应该执行。但由于某种原因,它仍然是。

你能告诉我我做错了什么吗?

谢谢!

3 个答案:

答案 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。