2012-08-24 145 views
0

如果添加OR条件语句,则此循环不会终止。如果一个是错误的,那么它应该终止。while循环将不会以逻辑条件终止

//全局变量

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

回答

3

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

也许你想:

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

这将终止循环如果满足两个条件是假的。

&&是'逻辑和'运算符,||是'逻辑或'运算符。为了帮助您保持跟踪,您可以使用Truth Table来帮助您理清细节。逻辑和与逻辑连接和逻辑相同或与逻辑分离相同。

+0

哦..好像我混了起来。谢谢大家澄清! – Dog

+0

请记住'&&'和'||'运营商是所谓的“短路”运营商,如果左侧操作数足以确定结果,则不会评估右侧操作数。结果可能与使用单个'&'或'|'不同当在表达式中执行功能评估时,如这里的情况那样。 (尽管在这种情况下函数会被调用,因为它是第一个操作数)。 –

+0

好吧,通过输入n,如果我使用&& – Dog

2

while循环将只要整个条件评估为1,或真正的执行。如果x从不100,那么在您的条件下的逻辑或将总是为真,因为它的一个操作数是真的。

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

+0

如果我按n,那么整个条件应该是假的并退出?但它不会退出 – Dog

+0

@ user1615805不,它是一个OR语句。所以,即使按_n_,只要'x'不是'100',循环就不会终止。 – pb2q

1

您选错了布尔运算符。如果输入n,并且x等于10,那么while条件就像这样简化:

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

由于每个比较已经是一个没有,你想& &,而不是||

1

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

因此,经典for环路测试是i < n和不i != n

当变量是一个布尔类型时,我只能以相等的方式终止循环。

+0

是什么? while((strncmp(n,“n”,1)!= 0)&& x < 100 && x > = 0) – Dog

+0

如果你需要循环继续,而x小于100 *和*非负数,那么是的。为了提高可读性,在包围括号的条件运算符之间使用表达式也是一种很好的做法。 –

0

条件X!= 100是永远不会当执行 第一,同时做是错误的,因为x已经递增到101所以做出的声明虚假ü应该代替使用& & ||