2

为什么布尔值&&在这种情况下起作用?当我输入“黄色”时,它不应该“短路”并且不检查第二个条件,因为第一个条件“红色”是错误的?

#include <iostream>
#include <string>    
using namespace std;

int main()
{
    string color;
    do
    {
        cout << "Pick one of the colors: red, yellow, or blue\n";
        cin >> color;
    }while ((color != "red") && ( color != "yellow") && ( color != "blue"));

    {
        cout << "I like that color too";
        return 0;
    }
}

  

4

4 回答 4

1

何时color"yellow"(color != "red")则为真。所以它检查下一个条件,(color != "yellow"),它是假的。所以条件是假的。不执行第三个测试(color != "blue"),因为表达式已经评估为 false,因此它的评估是短路的。

(color != "red")            // color == "yellow", so this is true
&& (color != "yellow")      // color == "yellow", so this is false
&& (color != "blue")
于 2013-06-23T06:48:53.867 回答
0

实际上,困惑在于您对条件的理解:

color != "red"

当您键入黄色时,它实际上是正确的,因为颜色不是红色,但是它在这里短路:

color != "yellow" 

因为条件为假,并且操作数&&必须全部为真,所以它短路。

于 2013-06-23T06:59:01.633 回答
0

这是查看代码的另一种方式:

看到 while 和 until 是相反的,我们可以将 do while(x) 重写为 do until(!x); 循环,遍历循环,直到条件 (!x) 为真。

用 until(!x) 代替 while(x),我们得到

#include <iostream>
#define until(!(x)) while(x)

int main()
{
    string color;
    do
    {
        cout << "Pick one of the colors: red, yellow, or blue\n";
        cin >> color;
     }
    until (!((color != "red") && ( color != "yellow") && ( color != "blue")));

    cout << "I like that color too";
    return 0;

}

使用德摩根定理,它指出 !((!x[0])&&(!x[1])&&...&&(!x[n])) == x[0] || x[1] || ... || x[n],我们可以将 until 语句转换为

until(color == "red" || color == "yellow" || color == "blue");    

因为 OR 仅在条件为真时短路,所以当您输入“黄色”时,第一个条件为假,第二个条件为真。这会导致短路,然后中断 do while() 循环并打印“我也喜欢那种颜色”!

于 2013-06-23T07:01:23.227 回答
0

&&万一事件,如果第一个条件评估为结果false,则整个条件将评估为false.

试试这个解决方案

while ((color != "red") || ( color != "yellow") ||( color != "blue"));
于 2013-06-23T06:52:43.733 回答