这个bool变量如何正常工作?

时间:2014-12-08 08:34:43

标签: c++ boolean

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

对于以下代码,我不知道bool变量到底是多少"更多"作品。它表示while循环将执行循环的内容,只要"更多"是的,但是

  1. 计算机如何知道更多是真的?是否足够聪明,知道"更多"字面意思是当用户通过键盘输入附加值时?此外,它是否知道不考虑负输入"更多"但只考虑正面输入"更多"?
  2. 在while循环中,当输入值为0时,它表示更多是false。但是,当它已经通过while循环时,在逻辑上没有意义,因为只有在真的!
  3. 我了解到,当"我们将获得一个无限循环,而总是如此"。似乎while循环永远是真的,因为more = true。
  4. 请帮我解决这个问题!!

    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);
    }
    

8 个答案:

答案 0 :(得分:5)

好的,一点一点地说:

1)编译器知道more为真,因为在第3行它说:

bool more = true;

这会创建bool more并为其赋值true

2)如果more等于false,则s 设置zero。虽然more在循环开始时为真,但没有什么可说的,它在循环内无法更改(这称为可变性)。

3)因为more在循环中设置为false,循环将停止执行。只有在有人输入0输入时才会发生这种情况。如果没有发生这种情况你是对的,循环将永远运行。

这是一个相当常见的while循环结构,它允许将任意数量的值添加到向量salaries。在你的问题中,你暗示不应该允许正数,值得注意的是,代码中没有任何内容强制执行此操作。也许改变这条线会更好:

if (s == 0)

为:

if (s <= 0.0)

这样,如果输入,如果输入负值,则循环将停止执行。

答案 1 :(得分:5)

(1):计算机(或编译器)不够智能,无法将more连接到字面含义。

(2):more可以在循环内更改,这是您输入0时发生的情况。将more更改为false后,将重新评估while (more)中的条件。由于more现在为假,所以退出循环。

(3):不,more并非总是如此,见(2)。

答案 2 :(得分:3)

在你的代码片段中,变量more被显式设置两次:在循环之前和循环内部,如果s等于零

bool more = true;
while (more)
{
  //...
  if (s == 0)
    more = false;
  //..
}

因此,当在循环体内将more设置为false时

  if (s == 0)
    more = false;

循环停止迭代,因为while中的条件不为真

while (more)

考虑到上述条件等同于

while (more == true)

虽然编写这样的方法没有多大意义,因为变量more已经是一个布尔表达式。

还要考虑到根据C ++标准

4.12布尔转换

  

1算术,无范围枚举,指针或指针的prvalue   成员类型可以转换为bool类型的prvalue。零   转换value,null指针值或null成员指针值   为假;任何其他值都转换为true。对于   直接初始化(8.5),类型为std :: nullptr_t的prvalue可以   转换为bool类型的prvalue;结果值为false。

您可以在不使用变量的情况下以其他方式重写代码段。例如

vector<double> salaries;

cout << "Please enter salaries, 0 to quit:" << endl;

double s;
while ( cin >> s && s != 0 )
{
    salaries.push_back(s);
}

或者while中的条件可以写成

while ( cin >> s && s )

因此,根据C ++标准的引用,如果s不等于0,则将其转换为bool true。至于表达cin&gt;&gt;然后类std :: istream有显式转换运算符,如果流没有处于错误状态,它将std :: cin转换为boolean值。

答案 3 :(得分:2)

在输入循环之前,变量more显式设置为true。在循环体中,如果more设置为false,则之后在循环体中不会执行任何其他操作。执行流程再次进入循环的开始,循环的条件被评估。由于morefalse,循环的主体不会再次执行。

答案 4 :(得分:1)

  1. 不,计算机(编译器,更合适)不知道编码背后的意图,变量和函数背后的细节,它只适用于需要在语法上正确的指令集。 在while(more)中,只要boolean true更多false,就可以运行循环,并在while(condition)时跳到下一条指令。
  2. false,这里为每次迭代检查一次条件,并且在迭代期间,编译器不会在while(true){set of instructions;}更多时检查并跳过其余代码。只在开始迭代之前检查条件。
  3. 当然,假设Infinite Loop条件始终为真,因此始终会执行代码块,我们将其称为{{1}}。

答案 5 :(得分:0)

好吧,您似乎并不真正了解编译器的工作方式。

首先,你的计算机并不聪明或愚蠢,它只是一台机器,并解释你给他们的任何东西。所以,这一切都取决于你编写程序的方式。话虽如此,我们继续前进:

while(condition) {
commands;
}

循环基本上如下:

  • 检查condition当你可能的任何内容 程序流程进入循环。
  • 当且仅当先前检查的条件为commands时,它才会继续执行true所有内容。
  • 如果不是这样,那么您的程序将继续按照while循环执行任何命令。
  • commands的执行完成后,再次检查condition中的while
  • 同样,如果它是真的,它继续commands
  • 如果没有,则再次继续执行以下while命令。

因此,总而言之,如果false没有意义,那么您的编译器,计算机或数字朋友不会检查您如何命名变量的逻辑流程。它仅检查{{1是condition。就是这样。

如果初始true在进入循环时conditiontrue并且退出循环时总是继续为真,则会发生无限循环(因为它可能会改变,所以不会在循环内部发生变化退出循环时也会获得true个值。

答案 6 :(得分:0)

你对C ++中的工作原理有一些误解。您可以将程序视为抽象机器。每个变量都是一个维护某些状态的存储位置。 more变量就是这种状态的一个例子。您可以将变量视为内存中保持所提供值的位置。允许整个程序状态在程序运行时间内发生变化。

每个赋值(=运算符)将变量的状态设置为赋值右侧的值。

所以当你说:

bool more = true;

名为more的存储位置设置为值true。在您为其指定新值之前,存储位置将保持true

请注意,在C ++语句中按顺序进行评估。由于变量的值可能会随着时间的推移而变化,因此语句的顺序很重要。

稍后你说:

while (more)
{
    // ...
}

第一次评估more时,它是true,但同样,由于more变量,该值可能会随时间而变化。

进入while循环后,当变量more等于s时,0变量有条件分配为false。请注意,与==运算符不同,=确实是一个等式检查。

    if (s == 0)
        more = false;

请注意,您应该知道s的类型为double,而文字0的类型为int。幸运的是,这将起作用,因为C ++会自动将int提升为double类型以进行相等比较。但是,它可能会因为使用文字0.0而明确表示您希望sdouble

由于s的值取决于从cin读取的值,因此相等条件有时为true,有时为false,具体取决于输入的内容由用户。但是如果more被赋予false,那么它会导致while循环在下一次迭代时终止。换句话说,当您到达近冠}时,程序将重复到while的开头并尝试重新评估more,此时{{1} } more false循环将结束。

答案 7 :(得分:0)

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; }

在这种情况下,您要告诉编译器从值i开始迭代一个名为0的变量,直到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; }