我是编程新手,所以如果我的问题太基础,请原谅我。
对于以下代码,我不知道bool变量到底是多少"更多"作品。它表示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);
}
答案 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
,则之后在循环体中不会执行任何其他操作。执行流程再次进入循环的开始,循环的条件被评估。由于more
为false
,循环的主体不会再次执行。
答案 4 :(得分:1)
while(more)
中,只要boolean
true
更多false
,就可以运行循环,并在while(condition)
时跳到下一条指令。false
,这里为每次迭代检查一次条件,并且在迭代期间,编译器不会在while(true){set of instructions;}
更多时检查并跳过其余代码。只在开始迭代之前检查条件。Infinite Loop
条件始终为真,因此始终会执行代码块,我们将其称为{{1}}。答案 5 :(得分:0)
好吧,您似乎并不真正了解编译器的工作方式。
首先,你的计算机并不聪明或愚蠢,它只是一台机器,并解释你给他们的任何东西。所以,这一切都取决于你编写程序的方式。话虽如此,我们继续前进:
while(condition) {
commands;
}
循环基本上如下:
condition
当你可能的任何内容
程序流程进入循环。commands
时,它才会继续执行true
所有内容。while
循环执行任何命令。commands
的执行完成后,再次检查condition
中的while
。commands
。while
命令。因此,总而言之,如果false
没有意义,那么您的编译器,计算机或数字朋友不会检查您如何命名变量的逻辑流程。它仅检查{{1是condition
。就是这样。
如果初始true
在进入循环时condition
为true
并且退出循环时总是继续为真,则会发生无限循环(因为它可能会改变,所以不会在循环内部发生变化退出循环时也会获得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
而明确表示您希望s
为double
。
由于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;
}