为什么即使条件为false,我的循环仍在运行?

时间:2019-04-30 05:38:14

标签: c

#include<stdio.h>
int no,tr_no;
char val;
int main (void) {
    void getno(void);
    void getval(void);
    void printall(int number);
    void printonly(int number);
    void print(void);

    getval();
    getno();

    if (val=='a')
        printall(no);

    if (val=='o')
        printonly(no);

    return 0;
}

void getval(void) { 
    printf("enter o for only 1 triangular number\n");
    printf("enter a for all the triangular number from 1 to that number\n");

    scanf(" %c",&val);

    while (val!='a' || val!='o') {
        printf("enter valid char\n");
        getval();
    }       
}

val==aval==o时,while循环不应运行,但仍会运行。不仅是while循环,if语句也不起作用。但是,当只有1个条件时,即

if (val!=a)
getval();

有效!

void getno(void)
{
    printf("enter number for which tr no needs to be found\n");
    scanf("%i",&no);
}
void printall(int number)
{
    int i;
    tr_no=0;
    void print(void);
    for (i=1;i<=number;i++)
    {
        tr_no=tr_no+i;
        printf("The %ith tr_no is\n",i);
        print();
    }
}
void printonly(int number)
{
    void print(void);
    tr_no=0;
    int i;
    for (i=1;i<=number;i++)
    {
        tr_no=tr_no+i;
    }
print();
}
void print(void)
{
    printf("%i\n",tr_no);
}

在getval函数中,即使将val的值输入为a或o或任何其他值,循环也将继续运行。请帮忙。

2 个答案:

答案 0 :(得分:2)

您的条件是val!='a' || val!='o'。让我们在这里看几个例子:

  • 应为val == 'b'。那么val != 'a'为真,val != 'o'为真,并且将它们在一起或为true || true,这是真的。
  • 假设val == 'a'。那么val != 'a'为假,而val != 'o'为真,因此将它们在一起或为false || true,这是真的。
  • 假设val == 'o'。这几乎等同于先前的情况; true || false是正确的。

问题在于,反转整个条件与反转每个组件并不相同。如果希望循环运行到val == 'a'或直到val == 'o',则需要与while (! (val == 'a' || val == 'o'))等效的内容。在这种情况下,de Morgan's law表示您需要将==更改为!= 并将||更改为{{1 }}。您希望它在&&不是val 并且 'a'不是val的情况下循环。

答案 1 :(得分:0)

在循环条件中使用&&

while (val!='a' && val!='o')

否则这是一个无穷循环,因为您的循环条件((val!='a' || val!='o'))始终为真。