【问题标题】:Why is my loop running even when the condition is false? [duplicate]即使条件为假,为什么我的循环仍在运行? [复制]
【发布时间】:2019-04-30 05:38:13
【问题描述】:
#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 或任何其他值,循环也会继续运行。请帮忙。

【问题讨论】:

  • (val!='a' || val!='o') 总是正确的
  • val != 'a' || val != 'o'。好的,让我们测试一下val = 'a'。当val = 'a' 时,则val != 'a' 为假,val != 'o' 为真。 || 像 OR 一样工作,所以 false || truetrue。所以循环会运行。
  • 与你的主要问题相切——你应该将函数声明放在main()之外,你应该把变量定义放在main()中。尽可能避免使用全局变量。函数可全局访问;在函数中声明它们是毫无意义的。
  • 不要在 getval 函数中使用递归,使用循环。否则,您最终可能会遭到拒绝服务攻击,有人可能会耗尽堆栈。
  • 而且不要使用全局变量!而是让函数 return 值。

标签: c


【解决方案1】:

您的条件是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 表示您需要将==s 更改为!=s,并且|| 更改为&amp;&amp;。您希望它在 val 不是 'a' 时循环,并且 val 不是 'o'

【讨论】:

  • 请记住,&amp;&amp;|| 运算符会进行短路评估。对于您的第一个假设 (val == 'b'),那么 val != 'a' 为真,因此短路评估开始,结果为真,无需测试 val != 'o'。第二种情况描述准确;第三种情况只评估val != 'a',因为这是真的,它从不评估val != 'o'
  • @JonathanLeffler 是的,但由于val != 'o' 没有副作用,我认为简化是合理的。
【解决方案2】:

在循环条件中使用&amp;&amp;

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2021-02-07
    • 2022-11-28
    • 2023-03-31
    • 2014-03-30
    相关资源
    最近更新 更多