如果我添加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);
}
答案 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。
x
从100
开始,每次循环时,您都会增加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;代替||