3

为什么此代码仅适用于&&操作员?

我认为应该是||,但我错了。Choice不能同时等于2个值吗?

我需要询问用户的输入,直到选择等于'a'OR 'd',但为什么我需要写&&?我不明白。

do
{
    scanf("%c", &choice);
} while ( choice != 'a' && choice != 'd' );

我想使用||,但它不起作用。

4

6 回答 6

6

运算符的工作方式没有任何问题,需要在此处获取代码的逻辑。

首先,do...while只要 中的条件while为 TRUE,循环就会运行。

在您的情况下,您想询问用户的输入,直到选择等于'a'OR 'd'

  • 所以,换一种方式,只要用户输入不等于aand d,就需要循环。

  • 从逻辑上讲,如果输入不等于a,它仍然可以等于d,因此您必须检查这两种情况。只有当输入都不是输入ad,您才继续循环。

请记住,您不是在检查相等性,而是在检查unequality。仅当两个不等式都满足时,只有while条件评估为 TRUE_ 并且您继续循环以请求新值。

简而言之,阅读德摩根定律

于 2016-12-27T13:51:14.053 回答
5

我需要询问用户的输入,直到选择等于“a”或“d”

这个条件可以写成

choice == 'a' ||  choice == 'd'

因此,如果您希望循环迭代直到此条件为真,您应该编写

do
{
    //...
} while ( !( choice == 'a' ||  choice == 'd' ) );

或者是否包含标题

#include <iso646.h> 

然后你可以写

do
{
    //...
} while ( not ( choice == 'a' ||  choice == 'd' ) );

甚至喜欢

do
{
    //...
} while ( not ( choice == 'a' or  choice == 'd' ) );

条件

!( choice == 'a' ||  choice == 'd' )

或者

not ( choice == 'a' or  choice == 'd' )

相当于

!( choice == 'a' ) &&  !( choice == 'd' )

或者

not ( choice == 'a' ) and  not ( choice == 'd' )

这又相当于

( choice != 'a' ) &&  ( choice != 'd' )

括号可以省略因此你将有

do
{
    //...
} while ( choice != 'a' &&  choice != 'd' );
于 2016-12-27T14:06:10.993 回答
5

您可以使用||. 您需要更改while循环条件表达式如下

while ( !(choice == 'a' || choice == 'd') ); 

这只是德摩根定律的一个应用,如何不影响 AND & OR

______   ___  ___
A || B =  A && B
______   ___  ___
A && B =  A || B

记住它:“打破界限,改变标志”。

INPUT   OUTPUT 1        OUTPUT 2
A   B   NOT (A OR B)    (NOT A) AND (NOT B)
0   0          1                 1
0   1          0                 0
1   0          0                 0
1   1          0                 0

INPUT   OUTPUT 1        OUTPUT 2
A   B   NOT (A AND B)   (NOT A) OR (NOT B)
0   0           1               1
0   1           1               1
1   0           1               1
1   1           0               0
于 2016-12-27T13:50:07.300 回答
4

您可以用这个替换条件:

while (!(choice == 'a' || choice == 'd'));

使用此条件do-while语句将一直执行,直到选择等于 'a' 或 'd'。

于 2016-12-27T13:50:16.083 回答
3

如果要使用 or ( ||) 运算符,则必须应用德摩根定律

假设 a 和 b 是布尔值,所以

a || b <=> !a && !b

a && b <=> !a || !b

这个,

while ( choice != 'a' && choice != 'd' );

是相同的

while !( choice == 'a' || choice == 'd' );
于 2016-12-27T13:54:13.877 回答
3

嘿,它不起作用,因为您希望它不等于 a 和 b。

not equal to a and not equal to b

so it will be !( eqaul to a or eqaul to b) (De morgan's)

德摩根定律说

not( a and b)  = not (a) or not(b)

在这里,我简单地应用了那个。

于 2016-12-27T13:52:15.530 回答