为什么布尔&&
在这种情况下有效?当我键入“黄色”不应该“短路”而不检查第二个条件,因为第一个条件“红色”是假的?
#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;
}
}
答案 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()循环并打印“我也喜欢那种颜色”!