C语言中的||和&&运算符

4
为什么这段代码只有使用 && 运算符才能正常工作?
我认为应该是 ||,但是我错了。选择不能同时等于两个值吗?
我需要询问用户的输入,直到选择等于 'a' 或者 'd',但是为什么我需要写 && ?我不明白。
do
{
    scanf("%c", &choice);
} while ( choice != 'a' && choice != 'd' );

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

3
在此处查看_DeMorgan定律_ 链接 - CristiFati
6个回答

7

操作员的工作方式没有问题,你需要理解这里的代码逻辑。

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

在你的情况下,你想要询问用户输入,直到选择等于'a''d'为止。

  • 因此,换一种方式来说,只要用户输入不等于ad,你就需要循环。

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

记住,你不是在检查相等性,而是在检查相等性。只有当两个相等性都被满足时,while条件才会评估为TRUE,并继续循环以请求新的值。

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


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

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' );

谢谢Vlad的详细解释!我想我明白了。 - Yellowfun

4
您可以使用以下条件替换它:
while (!(choice == 'a' || choice == 'd'));

使用这个条件do-while语句将一直执行,直到choice等于'a'或'd'。

这只能这样工作:while ( !(choice == 'a' || choice == 'd') ); - Yellowfun
需要再加一对括号。 - Yellowfun

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)

我这里只是简单地应用了一下。


3
如果你想使用或 (||) 运算符,你需要应用德摩根定理 (De Morgan's law):
假设 a 和 b 是布尔值,那么
a || b <=> !a && !b

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

This,

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

是同义词

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接