我只是尝试在C++中使用do while循环,而我想出了在do while循环中执行多项操作之后的括号内的描述或其他任何内容的描述.所以这是我最初的逻辑:我已经设置了password
变量和input
变量.如果两个东西匹配,那么它将退出循环并输出"正确的密码",否则它会继续回到循环,输出"错误的密码",所以它继续.这是我的代码:
// do while #includeusing 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
逻辑来达到这个结果,但我不明白为什么它现在正在工作...
C++ 对内置的1个布尔运算符使用短路评估,这意味着当你这样做时:
A && B
B
仅当被评估A
是true
,因为如果A
是false
,整个表达式是false
(无论的值B
).
所以在:
input != password && cout << "wrong password" << endl
当input != password
是false
(当你输入正确的密码),第二个操作数cout << "wrong password" << endl
不评估,因此没有什么outputed.
关于条件评估的额外细节:
类型input != password
是bool
;
类型cout << "..." << endl
是std::ostream&
;
阿std::ostream
是可转换为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
,因为流可能是处于故障状态,但这是不可能有std::cout
.