这个布尔变量究竟是如何工作的
How does this bool variable work exactly?
我是编程新手,如果我的问题太基本,请原谅我。
对于下面的代码,我不知道布尔变量"more"究竟是如何工作的。它说,只要"更多"为真,循环就会做循环的内容,但是
- 计算机如何知道越多是真实的?知道"更多"的字面意思是用户通过键盘输入附加值时,它是否足够聪明?另外,它是否知道负输入不被视为"更多",而只有正输入被视为"更多"?
- 在 while 循环中,它表示当输入值为 0 时,越多为假。但是,当它已经通过 while 循环时,更多是假的在逻辑上是没有意义的,只有当更多为真时才运行!
- 我了解到,当"while总是为真"时,我们会得到一个无限循环。似乎 while 循环将永远为真,因为更多 = 真。
请帮我解决这个问题!!
vector<double> salaries;
cout << "Please enter salaries, 0 to quit:" << endl;
bool more = true;
while (more)
{
double s;
cin >> s;
if (s == 0)
more = false;
else
salaries.push_back(s);
}
(1(:计算机(或编译器(不够智能,无法将more
连接到字面含义。
(2(:more
可以在循环内更改,这是当您输入0
时发生的情况。将more
更改为false
后,while (more)
中的条件将被重新评估。由于more
现在为 false,因此循环退出。
(3(:不,more
并不总是正确的,见(2(。
好的,所以一点一点:
1( 编译器知道more
是正确的,因为在第 3 行它说:
bool more = true;
这将创建布尔more
并赋予其值true
。
2( 如果s
等于 zero
,则more
设置为 false
。尽管more
在循环开始时是正确的,但没有什么可以说它不能在循环中更改(这称为可变性(。
3(由于more
在循环中设置为false,因此循环将停止执行。仅当有人输入输入0
时,才会发生这种情况。如果没有发生这种情况,您是对的,循环将永远运行。
这是一种相当常见的 while 循环结构,它允许将任意数量的值添加到向量salaries
中。在您的问题中,您暗示不应允许正数,值得注意的是,代码中没有任何内容强制执行这一点。也许最好更改该行:
if (s == 0)
自:
if (s <= 0.0)
这样,如果输入了0
值或输入了负值,循环将停止执行。
在代码片段中,变量 more
显式设置两次:循环之前和循环内部,如果 s 等于零
bool more = true;
while (more)
{
//...
if (s == 0)
more = false;
//..
}
因此,当在循环主体中将更多设置为 false 时
if (s == 0)
more = false;
循环停止其迭代,因为 while 中的条件将不为 true
while (more)
考虑到上述条件等效
于while (more == true)
虽然以这种方式编写没有多大意义,因为变量 more 已经是一个布尔表达式。
还要考虑到根据C++标准
4.12 布尔转换
1 算术、无作用域枚举、指针或指针的 prvalue 到 成员类型 可以转换为 bool 类型的 prvalue 值。零 转换值、空指针值或空成员指针值 为假;任何其他值都将转换为 true。为 直接初始化 (8.5(,可以是 std::nullptr_t 类型的 prvalue 转换为布尔类型的 prvalue;结果值为假。
你可以用其他方式重写代码片段,而无需使用变量更多。例如
vector<double> salaries;
cout << "Please enter salaries, 0 to quit:" << endl;
double s;
while ( cin >> s && s != 0 )
{
salaries.push_back(s);
}
或者条件甚至可以写成
while ( cin >> s && s )
因此,根据C++标准的引用,如果 s 不等于 0,则将其转换为布尔值 true。至于表达式 cin>> s,则类 std::istream 具有显式转换运算符,如果流未处于错误状态,则将 std::cin 转换为布尔值。
more
在进入循环之前显式设置为 true
。在循环的主体中,如果more
设置为false
,则之后不会在循环的主体中执行任何其他操作。执行流再次转到循环的开头,在此评估循环的条件。当more
被false
时,循环的主体不会再次执行。
- 不,计算机(编译器,更合适(不知道编码背后的意图,变量和函数背后的细节,它只处理一组指令,这些指令需要在语法上正确。在
while(more)
它的工作是运行循环,只要true
更多boolean
,并在false
时跳到下一条指令。 -
while(condition)
,这里的条件每次迭代都会检查一次,在迭代过程中,编译器不会费心检查和跳过其余代码,因为更多的代码false
。 仅在开始迭代之前检查条件。 - 当然,只要假设条件总是为真
while(true){set of instructions;}
因此代码块总是被执行,我们称之为Infinite Loop
。
好吧,您似乎并不真正了解编译器的工作方式。
首先,你的电脑不是智能的,也不是笨的,它只是一台机器,可以解释你给它们的任何东西。所以,这一切都取决于你编程程序的方式。话虽如此,我们继续前进:
这
while(condition) {
commands;
}
循环工作原理如下:
- 它会检查
condition
,无论在它的时候是什么程序流进入循环。 - 当且仅当
true
先前检查的条件时,它才会继续执行任何commands
。 - 如果不是真的,那么程序将继续执行遵循
while
循环的任何命令。 - 当
commands
的执行完成后,它会再次检查while
中的condition
。 - 同样,如果这是真的,它会继续
commands
. - 如果没有,则再次继续执行以下
while
命令。
因此,总而言之,您的编译器、计算机或您的数字朋友不会检查您如何命名变量的逻辑流程,如果false
没有意义,等等。它只是检查condition
是否true
。就是这样。
最后,如果在进入循环时true
初始condition
,并且退出循环时始终保持为真,则会发生无限循环(not 在循环内不会更改,因为它可能会更改并在退出循环时获得true
值(。
你对C++的运作方式有一些误解。您可以将程序视为抽象机器。每个变量都是维护某种状态的存储位置。more
变量就是这种状态的一个示例。您可以将变量视为内存中维护您为其提供的值的位置。允许在程序运行时的整个持续时间内更改总程序状态。
每个赋值(=
运算符(将变量的状态设置为赋值右侧的值。
所以当你说:
bool more = true;
名为 more
的存储位置设置为值 true
。存储位置将保持true
,直到您为其分配新值。
请注意,在C++语句中是按顺序计算的。由于变量的值可能会随时间而变化,因此语句的顺序很重要。
后来当你说:
while (more)
{
// ...
}
第一次计算more
时,它是 true
,但同样,由于more
是一个变量,该值可能会随着时间的推移而变化。
进入while
循环后,当变量s
等于 0
时,more
变量被有条件地分配为 false。请注意,与=
运算符不同,==
确实是相等性检查。
if (s == 0)
more = false;
请注意,您应该知道s
属于 double
类型,文本0
属于 int
类型。幸运的是,这将起作用,因为C++会自动将int
提升为double
类型以进行相等比较。但是,使用文字0.0
可能会清楚地表明您希望s
成为double
。
由于s
的值取决于从cin
读取的值,因此相等条件有时会true
,有时false
取决于用户输入的内容。但是如果more
被分配false
,那么它会导致while
循环在下一次迭代时终止。换句话说,当你到达右大括号}
程序将重复回到while
的开头并尝试重新评估more
,此时,当more
false
时,while
循环将结束。
vector<double> salaries;
cout << "Please enter salaries, 0 to quit:" << endl;
bool more = true;
while (more)
{
double s;
cin >> s;
if (s == 0)
more = false;
else
salaries.push_back(s);
}
while
循环将一遍又一遍地迭代,直到不满足()
之间的条件。当你开始循环时,你从bool more = true;
开始 这样你就告诉while(more)
循环在more
为真时继续迭代。在代码中,您要求输入 cin >> s;
,如果输入为 0,则变量more
将更改为 false
,它将再次迭代,并且由于while(more)
正在等待more
变量被true
因此条件不会true
并且循环将结束。如果输入的值不是0
则循环会将该值存储到vector<double> salaries
向量中。
获取存储在向量中的值的一种方法是:
for(int i = 0; i<salaries.size(); i++){
cout<< salaries[i] << endl;
}
在这种情况下,您告诉编译器从值0
开始迭代名为 i
的变量,直到 i
的值<
salaries.size()
的值,对于每次迭代,i
都会增加,当不再满足条件时,循环将结束。
建议对类型使用 std
命名空间,这将有助于将来的代码避免将std
命名空间中的所有内容引入代码中。
std::vector<double> salaries;
std::cout << "Please enter salaries, 0 to quit:" << std::endl;
bool more = true;
while (more)
{
double s;
std::cin >> s;
if (s == 0)
more = false;
else
salaries.push_back(s);
}
和
for(int i = 0; i<salaries.size(); i++){
std::cout<< salaries[i] << std::endl;
}
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个