0

如果我添加 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);
}
4

5 回答 5

3

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

也许你想要:

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

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

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

于 2012-08-24T18:04:07.857 回答
2

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

x从 开始100,每次循环时,递增x. 所以在你测试x循环条件之前,它大于 100 - 它是 101 - 并且总是增加。

于 2012-08-24T18:04:05.503 回答
1

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

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

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

于 2012-08-24T18:10:09.243 回答
1

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

因此,经典的for循环测试 isi < n和 not i != n

当变量是布尔类型时,我只用相等来终止循环。

于 2012-08-24T18:22:17.640 回答
0

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

于 2012-08-24T18:26:08.643 回答