while循环不会以逻辑条件终止

时间:2012-08-24 18:00:49

标签: c loops comparison while-loop conditional

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

// global var

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);
}

5 个答案:

答案 0 :(得分:3)

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

也许你想要:

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

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

&&是'逻辑和'运算符,||是'逻辑或'运算符。为了帮助您跟踪,您可以使用Truth Table来帮助您理清详细信息。逻辑和逻辑连接和逻辑相同或与逻辑析取相同。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

由于每次比较都已经是NOT,你想要&&而不是||

答案 3 :(得分:1)

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

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

当变量是布尔类型时,我只会终止具有相等性的循环。

答案 4 :(得分:0)

条件x!= 100永远不会为假,因为当第一次执行while时x已经增加到101 所以为了使声明变得虚假你应该使用&amp;&amp;代替||