谁能解释一下这个简单逻辑背后的逻辑?我迷路了
Can anyone explain the logic behind this simple logic? I'm lost
我只是在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
只有当A
true
时,B
才会被计算,因为如果A
是false
的,整个表达式都是false
的(无论B
的值是多少)。
所以在:
input != password && cout << "wrong password" << endl
false
input != 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 != 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
。
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"为假(即输入==密码)时,它将停止计算表达式。
希望这对:)有所帮助
对不起我的英语。
- "std::unique_XXX"命名约定背后的基本原理是什么?
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- std::背后的基本原理assignable_from可能的实现
- 传递背后的原因 通过引用C++中的函数?
- 无法理解代码背后的逻辑,这是在两个给定数字之间生成素数的优化问题
- 嵌套循环背后的逻辑
- std::set<Key,Compare,Allocator>::find() 函数使用"<"运算符而不是"=="运算符背后的直觉是什么?
- while(sline >> n >> c && c== ',')背后的逻辑是什么?
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- C++模板模板参数背后的基本原理
- C++活动异常机制背后的推理
- 此解决方案背后的直觉
- opengl中鼠标输入背后的数学和偏航/俯仰值
- 有人能解释一下这些说法背后的逻辑是什么吗
- 带有自定义类的共享指针语法背后的任何原因,如下所示
- 在C++中为零大小的分配返回唯一地址背后的基本原理是什么?
- libc++ 的 std::basic_string 的 16 字节对齐模式背后的原因是什么?
- 增加迭代变量背后的直觉?
- 有人可以向我解释下面指数函数背后的数学吗?
- 谁能解释一下这个简单逻辑背后的逻辑?我迷路了