为什么我在工作的时候不应该这样做?

时间:2013-06-23 06:44:12

标签: c++ boolean do-while

为什么布尔&&在这种情况下有效?当我键入“黄色”不应该“短路”而不检查第二个条件,因为第一个条件“红色”是假的?

#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 个答案:

答案 0 :(得分: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")

答案 1 :(得分:0)

&&个案例事件中,如果第一个条件评估为false,则结果将整个条件评估为false

试试这个解决方案

while ((color != "red") || ( color != "yellow") ||( color != "blue"));

答案 2 :(得分:0)

实际上,混淆在于你对条件的理解:

color != "red"

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

color != "yellow" 

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

答案 3 :(得分:0)

以下是查看代码的另一种方法:

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

直到(!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;

}

使用DeMorgan的定理,该定理指出!((!x [0])&amp;&amp;(!x [1])&amp;&amp; ...&amp;&amp;(!x [n]))= = x [0] || x [1] || ...... || x [n],我们可以将until语句转换为

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

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