Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的工作不应该做';T_C++_Boolean_Do While - Fatal编程技术网

C++ 为什么我的工作不应该做';T

C++ 为什么我的工作不应该做';T,c++,boolean,do-while,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

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

#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;
    }
}
#包括
#包括
使用名称空间std;
int main()
{
字符串颜色;
做
{
颜色;
}而((颜色!=“红色”)&&(颜色!=“黄色”)&&(颜色!=“蓝色”);
{

cout当
color
“黄色”
时,则
(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")

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

试试这个解决方案

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

实际上,困惑在于你对这种情况的理解:

color != "red"
当您键入黄色时,它实际上是真实的,因为颜色不是红色,但它在此处短路:

color != "yellow" 

由于条件为false,并且由于
&&
的操作数必须全部为true,因此它会短路。

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

看看单词while和until是如何相反的,我们可以将do while(x)重写为do until(!x);循环,在循环中迭代,直到条件(!x)为真

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


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

为什么要使用第二对括号?这是问题的一部分?在整个条件之前,您只需要一个小的
来纠正它。'因为第一个条件为“红色”是false吗?实际上不是。这可能是整个混乱的根源。这不是问题所在,但代码中有太多括号。在本例中,在诸如
color!=“red”之类的简单表达式周围不需要括号
。感谢您的快速回复!我发现了我的误解。提问者似乎一开始就想要这个代码,但这并不是他所问问题的答案;)语法应该是“repeat{}until()“。我没有使用正式的编程约定。我只是使用临时替换来试图澄清问题。你是对的。我添加了一个#define来帮助澄清。事实上,它必须这样做,只有当用户退出循环时才会打印,也就是说,只有当他/她选择红色、黄色或蓝色时才会打印。谢谢,我不知道为什么我会这样做。”用这个简单的概念避免麻烦。
#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;

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