这个布尔变量究竟是如何工作的

How does this bool variable work exactly?

本文关键字:工作 何工作 布尔 变量 究竟      更新时间:2023-10-16

我是编程新手,如果我的问题太基本,请原谅我。

对于下面的代码,我不知道布尔变量"more"究竟是如何工作的。它说,只要"更多"为真,循环就会做循环的内容,但是

  1. 计算机如何知道越多是真实的?知道"更多"的字面意思是用户通过键盘输入附加值时,它是否足够聪明?另外,它是否知道负输入不被视为"更多",而只有正输入被视为"更多"?
  2. 在 while 循环中,它表示当输入值为 0 时,越多为假。但是,当它已经通过 while 循环时,更多是假的在逻辑上是没有意义的,只有当更多为真时才运行!
  3. 我了解到,当"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,则之后不会在循环的主体中执行任何其他操作。执行流再次转到循环的开头,在此评估循环的条件。当morefalse时,循环的主体不会再次执行。

  1. 不,计算机(编译器,更合适(不知道编码背后的意图,变量和函数背后的细节,它只处理一组指令,这些指令需要在语法上正确。在while(more)它的工作是运行循环,只要true更多boolean,并在false时跳到下一条指令。
  2. while(condition),这里的条件每次迭代都会检查一次,在迭代过程中,编译器不会费心检查和跳过其余代码,因为更多的代码false。 仅在开始迭代之前检查条件。
  3. 当然,只要假设条件总是为真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; }