do-while语句中的错误逻辑?

时间:2014-02-05 20:50:54

标签: c operators logic logical-operators

我必须告诉你,我已经搜索过该网站和其他网站,但我无法解决我的问题。我正在做一个适用于某些列表的程序。代码将第二个列表中的值复制到第一个列表,条件是:列表2的当前值必须小于列表1中的值。如果此条件为真,则复制该值。但那不是重点。我创建了一个名为GetExitValue()的函数,它在main的末尾获取用户的输入是否继续。这就是问题所在。当我在main中调用该函数(在一段时间内)时,即使我插入n(否),它也会继续运行该程序。你能告诉我我做错了什么吗?非常感谢你们!

这是我的代码简化。

int main(){

    do{
    .
    . 
    .
    .
    printf("\nProgram finished. Do you wish to re-execute the program? \n\nPress y/Y (Yes) to continue. Press n/N (No) to exit. ");

    }
    while(GetExitValue() ==  'y' || 'Y' ); // **Problem here!!**

    return 0;
}


    char GetExitValue(){
        char exit_value;

            scanf(" %c", &exit_value);
            while(exit_value != 'y' && exit_value != 'n' && exit_value != 'Y' && exit_value != 'N'){
                        printf("Value incorrect. insert y or n!!\n");
                        scanf(" %c", &exit_value);
                    }
            return exit_value;
        }

3 个答案:

答案 0 :(得分:2)

这部分:

while(GetExitValue() ==  'y' || 'Y' ); // **Problem here!!**
你正确发现的

可能做你的意思。此始终为“true”,因为“Y”(ASCII中不为0)始终为“true”。

你在代码中确实有这个:while (condition || 1)这可能很有用,但在这种情况下不行。

你可能是这个意思:

.
.
// run GetExitValue() only once...
char gev = GetExitValue();
}
while(gev ==  'y' || gev == 'Y' );

我只想指出你可以这样做:

.
.
}
while(GetExitValue()); // no need to store value!

如果只有当用户不希望它再次运行时你改变GetExitValue()才能返回0:

char GetExitValue(){
    char exit_value;

        scanf(" %c", &exit_value);
        while(exit_value != 'y' && exit_value != 'n' && exit_value != 'Y' && exit_value != 'N'){
                    printf("Value incorrect. insert y or n!!\n");
                    scanf(" %c", &exit_value);
                }

        return exit_value == 'Y' || exit_value == 'y'; //evaluates to 1 if true
    }

它可能会更干净,您可以将其名称更改为shouldRunAgain(),根据我的个人喜好,这可以提供更多信息:)

答案 1 :(得分:0)

while表达式评估为:

while( ( GetExitValue() ==  'y' ) || 'Y' );

所以表达式总是正确的,因为 any或true == true

答案 2 :(得分:0)

你的问题在这里 -

while(GetExitValue() == 'y' || 'Y' );

'Y'部分将始终为真,因为在C中,任何非零(false)的都是真的。 “Y”的ASCII值不为零,因此,while条件将始终返回true。

你应该做的就是这个 -

`char x=GetExitValue();
 while(x ==  'y' || x=='Y' );`