同时执行循环条件语句否定等价

时间:2019-10-03 15:56:02

标签: c++ logic conditional-statements negation

社区和编程的新手。我很好奇为什么这两个逻辑语句在我的程序中是等效的。目前,我似乎无法将这种具体逻辑束之高阁,我想了解为什么它会如此工作。

最初,我写了以下内容:

    char c;
    do {
        cin >> c;
        cout << "You entered: " << c << "\n";
    } while (c != 'Y' || c != 'y' || c != 'N' || c || 'n');
    return 0;
}

但是,除非我使用&&,否则这似乎不起作用。 后来,我发现使用或确实可以,但是我的否定必须在外面。这是使我感到困惑的两个条件。为什么它们在逻辑上是等效的?

while (!(c == 'Y' || c == 'y' || c == 'N' || c || 'n')); // Will run until c is the following
while (c !='Y' && c != 'y' && c != 'N' && c != 'n'); // Will also run but without being negated.

1 个答案:

答案 0 :(得分:0)

do-while循环中的这些逻辑表达式

while (!(c == 'Y' || c == 'y' || c == 'N' || c || 'n')); // Will run until c is the following
while (c == 'Y' && c == 'y' && c == 'N' && c == 'n'); // Will also run but without being negated.

不相同。

表达式

while (!(c == 'Y' || c == 'y' || c == 'N' || c || 'n'));

等同于

while ( c != 'Y' && c != 'y' && c != 'N' && !c && !'n' );

如果您有类似这样的表达式

a == b || c == d

然后取反

!( a == b || c == d )

等同于

!( a == b ) && !( c == d )

最后到

a != b && c != d

请注意此do-while循环

char c;
do {
    cin >> c;
    cout << "You entered: " << c << "\n";
} while (c != 'Y' || c != 'y' || c != 'N' || c || 'n');

没有道理。例如,如果用户输入了'N',则循环将继续其迭代,因为第一个子表达式c != 'Y'表示为true。