我只是在C ++中尝试do while循环,而我想出了在do while循环中执行多项操作之后的括号内的描述或其他任何内容的描述。
所以这是我最初的逻辑:我已经设置了password
变量和input
变量。如果两个东西匹配,那么它将退出循环并输出“正确的密码”,否则它会继续回到循环,输出“错误的密码”,所以它继续。这是我的代码:
// do while
#include<iostream>
using namespace std;
int main(){
int input, password=19960819;
do{
cout << "Type your password:" ;
cin >> input;
}while(input!=password && cout << "wrong password" << endl);
cout << "correct password" << endl;
return 0;
}
我原以为即使我输入了正确的答案,我仍然会输出“密码错误”。我认为cout << "wrong password" << endl
部分总是以true
的形式返回,无论如何都应该执行,并且唯一的因素是input!=password
部分。然而,结果实际上是完美的,这不是我所期待的......任何人都可以解释逻辑吗?我正在挑战自己不使用if
或其他逻辑,只是使用do while
逻辑来达到这个结果,但我不明白为什么它现在正在工作......
答案 0 :(得分:12)
C ++对内置的 1 布尔运算符使用short-circuit evaluation,这意味着当你这样做时:
A && B
仅当B
为A
时才会评估 true
,因为如果A
为false
,则整个表达式为false
(无论价值B
)。
所以:
input != password && cout << "wrong password" << endl
当input != password
为false
时(当您输入正确的密码时),第二个操作数cout << "wrong password" << endl
未被评估,因此没有任何内容被输出。
评估条件的额外细节:
input != password
的类型为bool
; cout << "..." << endl
的类型为std::ostream&
; std::ostream
是convertible to bool
直接(自C ++ 11以来)或使用转换为void*
(C ++ 03)。由于没有operator&&(bool, [const] std::ostream&)
且std::ostream
可转换为bool
,因此此处使用内置operator&&(bool, bool)
,因此应用 2进行短路评估
当input != password
为true
时(您输入了错误的密码),评估cout << "..." << endl
,然后转换为bool
值,true
大部分时间 3 ,从而允许循环继续。
当input != password
为false
时,短路会阻止评估cout << "..." << endl
,并且不会向输出发送任何内容。
1 对于过载运算符,短路评估不再适用。请参阅http://en.cppreference.com/w/cpp/language/operator_logical。
2 您可以在&&
之前为main
添加用户定义的重载,例如bool operator&&(bool b, std::ostream &s) { return b && (bool)s; }
,看短路仅适用于内置运营商。
3 无法保证返回true
,因为流可能处于失败状态,但不太可能 { {1}}。子>
答案 1 :(得分:2)
cout << "wrong password" << endl
始终评估为true
(通过转换为bool
运算符),并且具有输出该文本的副作用。
但由于input != password
的短暂性质,仅在&&
进行评估。
真的很可爱。就个人而言,我会写
} while (input != password && std::cout << "wrong password\n");
请注意,这依赖于std::basic_ios::operator bool
,它已从C ++ 11中巧妙地改变了。见http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool。在许多方面,最好避免像这样的华而不实的代码。
答案 2 :(得分:1)
这是因为&amp;&amp;和||被评估为短路。因此,例如,A&amp;&amp;如果A和B都是(并且只有两者)都为真,B将评估为真,但是(并且这里是短路)如果A或B为假则为假,因此当A为假时,无需评估乙
在您的方案中,当comparaisson输入!=密码&#39;是假的(即输入==密码),它停止评估表达式。
希望这会有所帮助:)
抱歉我的英文。