【问题标题】:while loop won't terminate with a logical conditionalwhile 循环不会以逻辑条件终止
【发布时间】:2012-08-20 07:35:18
【问题描述】:

如果我添加 OR 条件语句,此循环不会终止。如果一个是假的,那么它应该终止。

//全局变量

int x = 100;
    char *n= malloc (64);

void add(void)
{       

    do      
    {
        printf("Would you like to add 1? (y/n) ");
        fgets(n, 64, stdin);
            //removes newline
        n[strlen(n)-1] = '\0';
            x++;
    }       
//if I add || (x!=100) it keeps looping me even if I press "n"
//otherwise without it it works fine

        while((strncmp(n, "n", 1) != 0) || x!=100 );

        free(n);
}

【问题讨论】:

    标签: c loops comparison while-loop conditional


    【解决方案1】:

    在循环的底部,您正在执行x++。一旦你达到了 while 条件 x == 101,那么你的循环就永远不会终止,x 在检查条件时永远不会等于 100。

    也许你想要:

    while((strncmp(n, "n", 1) != 0) && x != 100);
    

    如果两个条件中的任何一个为假,就会终止循环。

    && 是“逻辑与”运算符,|| 是“逻辑或”运算符。为了帮助您跟踪,您可以使用Truth Table 来帮助您整理详细信息。逻辑与与逻辑合取相同,逻辑或与逻辑析取相同。

    【讨论】:

    • 哦.. 看来我搞混了。谢谢大家的澄清!
    • 记住'&&'和'||'运算符是所谓的“短路”运算符,如果左侧操作数足以确定结果,则不会计算右侧操作数。结果可能与使用单个 '&' 或 '|' 不同当在表达式中执行函数评估时,就像这里的情况一样。 (虽然在这种情况下,函数将被调用,因为它是第一个操作数)。
    • 好的,输入n,如果我使用&&,编译器甚至不会检查正确的操作数
    • @user1615805 对于&&,如果第一个操作数为假,则不会计算第二个操作数。使用||,如果第一个操作数为真,则不会计算第二个操作数。
    【解决方案2】:

    只要整个条件的计算结果为1 或为真,while 循环就会执行。如果x从不 100,那么您的条件中的逻辑或将始终为真,因为其中一个操作数为真。

    x100 开始,每次循环时,您递增x。因此,在您在循环条件下测试 x 之前,它大于 100 - 它是 101 - 并且总是增加。

    【讨论】:

    • 如果我按 n 那么整个条件应该为假并退出?但它不会退出
    • @user1615805 不,这是一个 OR 语句。所以即使你按下n,只要x不是100,循环就不会终止。
    【解决方案3】:

    您选择了错误的布尔运算符。如果键入 n,并且 x 等于 10,则 while 条件简化如下:

    while((strncmp(n, "n", 1) != 0) || x!=100 ); 而((0!= 0)||(10!= 100)); 而(0 || 1) 而(1)

    由于每个比较都已经是 NOT,因此您需要 && 而不是 ||

    【讨论】:

      【解决方案4】:

      检查数值相等来终止循环通常是一个坏主意。您想要检查一系列值,例如,x < 100

      因此,经典的 for 循环测试是 i < n 而不是 i != n

      只有当变量是布尔类型时,我才会以相等方式终止循环。

      【讨论】:

      • 这样吗? while((strncmp(n, "n", 1) != 0) && x = 0 )
      • 如果您要求在 x 小于 100 并且非负数时继续循环,那么可以。为了便于阅读,在条件运算符之间用括号括起来也是一种很好的做法。
      【解决方案5】:

      条件 x!=100 永远不会为假,因为在执行第一个 do while 时 x 已经递增到 101 因此,要使陈述为假,您应该使用 && 代替 ||

      【讨论】:

        猜你喜欢
        • 2017-02-09
        • 2013-04-08
        • 1970-01-01
        • 1970-01-01
        • 2020-07-18
        • 2019-01-08
        • 2019-01-29
        • 2013-11-22
        • 1970-01-01
        相关资源
        最近更新 更多