谁能解释一下这个简单逻辑背后的逻辑?我迷路了

Can anyone explain the logic behind this simple logic? I'm lost

本文关键字:背后 迷路 简单 能解释 一下      更新时间:2023-10-16

我只是在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逻辑来达到这个结果,但我不明白它现在起作用的原因......

C++对内置的1布尔运算符使用短路计算,这意味着当您这样做时:

A && B

只有当Atrue时,B才会被计算,因为如果Afalse的,整个表达式都是false的(无论B的值是多少)。

所以在:

input != password && cout << "wrong password" << endl

falseinput != password时(输入正确的密码时),不会计算第二个操作数cout << "wrong password" << endl,因此不会输出任何内容。


有关条件评估的其他详细信息:

  • 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 != passwordtrue(您输入了错误的密码)时,cout << "..." << endl被评估,然后转换为bool值,该值将在大多数时间true3,从而允许循环继续。

input != passwordfalse时,短路会阻止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

cout << "wrong password" << endl总是计算结果为true(通过转换为运算符bool并且具有输出该文本的副作用。

但这只有在input != password的情况下才能评估,因为&&的短切性质。

它相当可爱,真的。不过就个人而言,我会写

} while (input != password && std::cout << "wrong passwordn");

请注意,这依赖于从 C++11 开始发生微妙变化的std::basic_ios::operator bool。请参阅 http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool。在许多方面,最好避免像这样的华而不实的代码。

这是因为 && 和 || 是在短路中评估的。因此,例如,如果 A 和 B 都为真(并且只有两者为真),则 A && B 将评估为 true,但是(这里是短路)如果 A 或 B 为假,则为假,因此当 A 为假时,无需评估 B。

在您的场景中,当比较"input!=password"为假(即输入==密码)时,它将停止计算表达式。

希望这对:)有所帮助

对不起我的英语。