在多个条件下进行测试(C 语言)

Testing while for multiple conditions (C language)

提问人:Ansh 提问时间:9/24/2016 最后编辑:alkAnsh 更新时间:9/24/2016 访问量:1510

问:

我必须创建一个菜单,如果输入无效。它应该不断要求提供有效的输入。我在下面写了它(用 C 语言)

   #include <stdio.h>
int main()
{
    int input = 0;
    printf("What would you like to do? \n 1 (Subtraction) \n 2 (Comparison) \n 3 (Odd/Even) \n 4 (Exit) \n ");
    scanf_s("%d", &input);

    while (input != 1 || input != 2 || input != 3|| input != 4)
    {
        printf("Please enter a valid option \n");
        scanf_s("%d", &input);
}   // At this point, I think it should keep testing variable input and if it's not either 1 or 2 or 3 or 4. It would keep looping.

但实际情况是,即使输入为 2,它也会循环。

c while-loop 布尔逻辑

评论

1赞 Franck 9/24/2016
您的 while 条件始终是,因为每个输入都不同于 1 或 2。您应该更改为 。true||&&
1赞 alk 9/24/2016
如果输入等于 1 和 2 以及 3 4(同时),您的循环将停止。这是不可能的。所以它会永远循环。
0赞 Ansh 9/24/2016
@Franck 但是,如果我输入 2,这难道不会使这种情况不成立吗?
0赞 Franck 9/24/2016
否,如果你的输入是 2,将返回 ,但将返回 。按原样,您的最终结果是 。input != 2falseinput != 1truetrue || falsetruetrue

答:

2赞 eavidan 9/24/2016 #1

你所写的是,如果变量不是其中之一,你就循环。 你想要的是或while(input < 1 || 4 < input)while(input != 1 && input != 2 && input != 3 && input != 4)

评论

0赞 Ansh 9/24/2016
我的输入永远不会是 1 和 2 以及 3 和 4。这将是其中之一。所以也不会有意义吗?
1赞 eavidan 9/24/2016
例如,如果输入 2,则计算结果为 true,因为输入 != 1 为 true。但是,如果您使用我的示例,您会看到它的计算结果为 false,因为即使输入 != 1 为 true,因为输入 != 2 的 AND。您应该在IDE中针对某些输入运行它,也许这将有助于您更好地理解问题
0赞 M.M 9/24/2016
@Ansh您希望所有条件同时为真:与所有选项不同input
3赞 alk 9/24/2016 #2

你的代码是说:只要满足以下条件,就循环:

(input != 1 || input != 2 || input != 3 || input != 4)

把这个转过来,代码说:如果上述条件是假的,则断开循环,这对于

!(input != 1 || input != 2 || input != 3 || input != 4)

现在让我们将德摩根定律应用于上面的表达式,我们将得到逻辑相等表达式(作为循环的中断条件):

(input == 1 && input == 2 && input == 3 && input == 4)

如果上述情况为真,则循环将中断。如果等于 和 和 和 同时,则为真。这是不可能的,因此循环将永远运行。input1234

但实际情况是,即使输入为 2,它也会循环。

如果 是 ,它仍然不相等,并且 ,这使得循环条件变为真,循环继续进行。:-)input2134


与您的问题无关:

由于您希望循环的代码至少执行一次,因此您应该使用 -loop。do {...} while

do
{
    printf("Please enter a valid option \n");
    scanf_s("%d", &input);
} while (!(input == 1 || input == 2 || input == 3 || input == 4))

或(再次关注德摩根):

do
{
    printf("Please enter a valid option \n");
    scanf_s("%d", &input);
} while (input != 1 && input != 2 && input != 3 && input != 4)

甚至更紧:

do
{
    printf("Please enter a valid option \n");
    scanf_s("%d", &input);
} while (input < 1 || input > 4)

评论

1赞 Vucko 9/24/2016
我喜欢德摩根定律的用法!这是一个很好的解释。
0赞 Ansh 9/24/2016
@alk你的第一个 do while 代码说 while input not equal to 1 and 2 and 3 and 4.做点什么。这意味着即使我输入 3,do 部分也会被执行。因为它不等于 3 和 4,对吧?
0赞 Ansh 9/24/2016
@alk 我觉得那一点点!In the While 语句是问题的解决方案。我会测试一下,看看。范克布鲁。
0赞 alk 9/24/2016
@Ansh:这不仅仅是你的代码形式不同。请多看两遍。!
0赞 Ansh 9/24/2016
@alk仅供参考,您在 C 中的第一个 do while 是错误的。你的第二个代码可以工作,但它确实是第一......只是需要一点调整..像魅力母鹿一样工作。升级!