当变量之一稍后更新时,计算结果不会更改
Result of calculation is not changed when one of the variables is updated later
在以下代码中,除最后一个"武器总计"外,一切都很好。当我将 1添加到numberPistols
时,这没有更新。我知道numberPistols
已更新,但是在最后一行使用numberWeapons
时,它不会显示新值。
我仍然不明白为什么,有人可以向我解释并告诉我我做错了什么?
#include <iostream>
using namespace std;
int main() {
int numberPistols = 5;
int numberKnives = 18;
int numberWeapons = numberPistols + numberKnives;
cout << "Number of Pistols: " << numberPistols << endl;
cout << "Number of Knives: " << numberKnives << endl;
cout << "Total of Weapons: " << numberPistols + numberKnives << endl;
cout << "There's a new Pistol available!" << endl;
numberPistols = numberPistols + 1;
cout << "New amount of Pistols " << numberPistols << endl;
cout << "Updated total of Weapons " << numberWeapons << endl;
return 0;
}
在此程序中,所有语句均被顺序执行,每个语句仅执行一次。您必须重写或循环语句重复。
int numberPistols = 5;
int numberKnives = 18;
int numberWeapons = numberPistols + numberKnives;
让我们在您的程序上进行干式运行:
- 首先,您已声明了一个整数类型变量
numberPistols
,并用值'5'初始化了它。 - 然后,您已声明了一个整数类型变量
numberKnives
,并以值'18'初始化了它。 - 在下一个语句中,您已声明了一个变量
numberWeapons
,并以从numberPistols
和numberKnives
的总和获得的值初始化了它。 - 打印了所有变量后,您将
numberPistols
的值数递减1。
错误:
您已更新了numberPistols
,但您尚未再次更新numberWeapons
。更改numberPistols
或numberKnives
的值不会影响numberWeapons
的值,因为它已经存储了,您必须使用新值更新存储的值才能使更改发生。
解决方案:
添加此行numberWeapons = numberPistols + numberKnives;
numberPistols = numberPistols + 1;
现在,您的最终代码将是:
#include <iostream>
using namespace std;
int main() {
int numberPistols = 5;
int numberKnives = 18;
int numberWeapons = numberPistols + numberKnives;
cout << "Number of Pistols: " << numberPistols << endl;
cout << "Number of Knives: " << numberKnives << endl;
cout << "Total of Weapons: " << numberPistols + numberKnives << endl;
cout << "There's a new Pistol available!" << endl;
numberPistols = numberPistols + 1;
numberWeapons = numberPistols + numberKnives; //update the numberWeapons here
cout << "New amount of Pistols " << numberPistols << endl;
cout << "Updated total of Weapons " << numberWeapons << endl;
return 0;
}
carcigenate已经评论,一种通常的方法是写一个函数
#include <iostream>
using namespace std;
int getNumberWeapons(int numberPistols, int numberKnives)
{
return numberPistols + numberKnives;
}
int main() {
int numberPistols = 5;
int numberKnives = 18;
cout << "Number of Pistols: " << numberPistols << endl;
cout << "Number of Knives: " << numberKnives << endl;
cout << "Total of Weapons: " << getNumberWeapons(numberPistols, numberKnives) << endl;
cout << "There's a new Pistol available!" << endl;
numberPistols = numberPistols + 1;
cout << "New amount of Pistols " << numberPistols << endl;
cout << "Updated total of Weapons " << getNumberWeapons(numberPistols, numberKnives) << endl;
return 0;
}
更好的解决方案是上课。这可能会被夸大,但是如果您想扩展"武器卡宾",那将是合适的。它添加了几个成员功能来操纵课程并访问它们。
#include <iostream>
using namespace std;
class WeaponCabinet
{
public:
void setNumberPistols(int pistols)
{
numberPistols = pistols;
}
void setNumberKnives(int knives)
{
numberKnives = knives;
}
void addPistol()
{
++numberPistols;
}
void addKnive()
{
++numberKnives;
}
void removePistol()
{
if (numberPistols == 0) return;
--numberPistols;
}
void removeKnive()
{
if (numberKnives == 0) return;
--numberKnives;
}
int getNumberKnives()
{
return numberKnives;
}
int getNumberPistols()
{
return numberPistols;
}
int getNumberWeapons()
{
return numberKnives + numberPistols;
}
private:
int numberPistols;
int numberKnives;
};
int main() {
WeaponCabinet weaponCabinet;
weaponCabinet.setPistols(5);
weaponCabinet.setKnives(18);
cout << "Number of Pistols: " << weaponCabinet.getNumberPistols() << endl;
cout << "Number of Knives: " << weaponCabinet.getNumberKnives() << endl;
cout << "Total of Weapons: " << weaponCabinet.getNumberWeapons() << endl;
cout << "There's a new Pistol available!" << endl;
weaponCabinet.addPistol();
cout << "New amount of Pistols " << weaponCabinet.getNumberPistols() << endl;
cout << "Updated total of Weapons " << weaponCabinet.getNumberWeapons() << endl;
return 0;
}
通过这种方式,您在刀和手枪之间有直接的连接,并且不必每次将它们传递到功能getNumberWeapons
。
如果您不需要整个班级处理武器,那么最现代的技术就是使用lambda(使用功能更接近解决方案)
#include <iostream>
using namespace std;
int main() {
int numberPistols = 5;
int numberKnives = 18;
auto numberWeapons = [&numberPistols, &numberKnives]()
{
return numberPistols + numberKnives;
};
cout << "Number of Pistols: " << numberPistols << endl;
cout << "Number of Knives: " << numberKnives << endl;
cout << "Total of Weapons: " << numberWeapons() << endl;
cout << "There's a new Pistol available!" << endl;
numberPistols = numberPistols + 1;
cout << "New amount of Pistols " << numberPistols << endl;
cout << "Updated total of Weapons " << numberWeapons() << endl;
return 0;
}
写
int numberWeapons = numberPistols + numberKnives;
这不会创建一个"方程式",该方程在每次更改后自动更新。该行在开始时一次执行一次,并且由于您没有循环,因此再也不会执行。
您需要在更改后手动更新总计:
#include <iostream>
using namespace std;
int main() {
int numberPistols = 5;
int numberKnives = 18;
int numberWeapons = numberPistols + numberKnives;
cout << "Number of Pistols: " << numberPistols << endl;
cout << "Number of Knives: " << numberKnives << endl;
cout << "Total of Weapons: " << numberPistols + numberKnives << endl;
cout << "There's a new Pistol available!" << endl;
numberPistols = numberPistols + 1;
//Manually update the variable.
numberWeapons = numberPistols + numberKnives;
cout << "New amount of Pistols " << numberPistols << endl;
cout << "Updated total of Weapons " << numberWeapons << endl;
return 0;
}
注意,它看起来就像是第一次设置,除了int
,因为我不是声明 numberWeapons
just repainsing it。
在"真实"程序中,您将使用一个处理更新的函数,但我认为这只会掩盖逻辑听到的声音,因为您只是将2个数字添加在一起。
变量是彼此独立的。为了向您解释,我们可以从苹果开始:
我给露西给了两个苹果。我给你三个苹果,说:"我给你一个苹果,加上给露西的苹果数量。"然后,一段时间后,我将另一个苹果给露西。你有几个苹果?
答案很简单:这是三个。就像C 或任何其他编程语言中的变量一样,您和Lucie的苹果数量彼此独立。变量彼此独立。
突变变量的值不会影响另一个变量的值,即使您使用变量计算另一个值的值。
如果您想始终具有更新的号码怎么办?
然后,您必须每次计算值。程序员通常会使用功能来执行此操作。在您的示例中,我们可以将武器总数定义为返回numberPistols
加上numberKnives
的函数。这就是我的方式:
#include <iostream>
using namespace std;
int main() {
int numberPistols = 5;
int numberKnives = 18;
auto computeNumberWeapons = [&]{ return numberPistols + numberKnives; };
cout << "Number of Pistols: " << numberPistols << endl;
cout << "Number of Knives: " << numberKnives << endl;
cout << "Total of Weapons: " << numberPistols + numberKnives << endl;
cout << "There's a new Pistol available!" << endl;
numberPistols = numberPistols + 1;
cout << "New amount of Pistols " << numberPistols << endl;
cout << "Updated total of Weapons " << computeNumberWeapons() << endl;
return 0;
}
现在, computeNumberWeapons
不是类型int
的变量,而是计算两个变量的总和的函数。您必须使用()
操作员调用该功能。
这也许不是您在第一个C 课程中要学习的东西,但是如果您'RE使用C 11,您可以用lambda函数替换int numberWeapons
,该功能在调用它时累加numberPistols
和numberKnives
的当前值:
auto numberWeapons = [&numberPistols, &numberKnives]() {
return numberPistols + numberKnives;
};
numberWeapons
现在是一个函数,从语句的[&numberPistols, &numberKnives]
部分中知道numberPistol
和numberKnives
变量。它不需要参数-()
-它返回两个变量的总和。
(实际上,()
可以在此处省略,因为它们是空的,没有关于此功能的论点,但是我将它们留在其中,因为它使其更具识别为lambda功能,通常看起来像[…](…){…}
。
#include <iostream>
using namespace std;
int main() {
int numberPistols = 5;
int numberKnives = 18;
auto numberWeapons = [&numberPistols, &numberKnives]() {
return numberPistols + numberKnives;
};
cout << "Number of Pistols: " << numberPistols << endl;
cout << "Number of Knives: " << numberKnives << endl;
cout << "Total of Weapons: " << numberWeapons() << endl; // outputs 23
// note the brackets ^^
cout << "There's a new Pistol available!" << endl;
numberPistols = numberPistols + 1;
cout << "New amount of Pistols " << numberPistols << endl;
cout << "Updated total of Weapons " << numberWeapons() << endl; // outputs 24
// ^^
return 0;
}
我理解,还尝试了您在这里发布的其他代码,其中一个在我尝试编译和运行时给我错误(下面是代码)。我正在使用Dev-C 5.11。
int main() {
int numberPistols = 5;
int numberKnives = 18;
auto computeNumberWeapons = [&]{ return numberPistols + numberKnives; };
cout << "Number of Pistols: " << numberPistols << endl;
cout << "Number of Knives: " << numberKnives << endl;
cout << "Total of Weapons: " << numberPistols + numberKnives << endl;
cout << "There's a new Pistol available!" << endl;
numberPistols = numberPistols + 1;
cout << "New amount of Pistols " << numberPistols << endl;
cout << "Updated total of Weapons " << computeNumberWeapons()) << endl;
return 0;
}
有时我使用的这个IDE 编译器会让我认为是否是错误的代码,或者在安装并在其中启动项目时做错了什么...
错误图像
好的,可以在下面的函数下添加此功能,然后在int main()
之前添加此功能//function for calculating numberWeapons
int totalWeapons(int numberPistols, int numberKnives){
return numberPistols+numberKnives;
}
并在您需要更新的NumberWeapons中添加下面给出的行:
numberWeapons = totalWeapons(numberPistols, numberKnives);
即。您的代码就像:
#include <iostream>
using namespace std;
//function for calculating numberWeapons
int totalWeapons(int numberPistols, int numberKnives){
return numberPistols+numberKnives;
}
int main() {
int numberPistols = 5;
int numberKnives = 18;
int numberWeapons = totalWeapons(numberPistols, numberKnives); //call function here
cout << "Number of Pistols: " << numberPistols << endl;
cout << "Number of Knives: " << numberKnives << endl;
cout << "Total of Weapons: " << numberWeapons << endl;
cout << "There's a new Pistol available!" << endl;
numberPistols = numberPistols + 1;
//call function here to get updated numberWeapons
numberWeapons = totalWeapons(numberPistols, numberKnives);
cout << "New amount of Pistols " << numberPistols << endl;
cout << "Updated total of Weapons " << numberWeapons << endl;
return 0;
}
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 计算幂级数的数学结果不正确
- 当我的 if 条件计算结果为 false 时,我的 else 块将不会执行
- 为什么组合的上限和下限比较的计算结果总是为 true?
- 为什么'typeid(x) == typeid(y)'的计算结果为 true,其中 'x' 和 'y' 分别是 T 和 T& 类型的 id-表达式?
- 在Javascript和C++中计算MD5哈希的不同结果
- 为什么 Lisp 中 1000 阶乘的计算如此之快(并显示正确的结果)?
- 我们如何并行运行算法的 n 个实例并以有效的方式计算结果函数的平均值?
- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- WebGL2 和 C++ 上的浮点计算结果不同
- 术语的计算结果不是采用0个参数的函数
- C++编译器能在编译时计算出文字的除法结果吗
- 错误 C2064:术语的计算结果不是采用 3 个参数的函数
- 在C++中,是否可以编写一个条件的lambda,即只是一个计算结果为真或假的条件
- C++ 函数指针的计算结果为 1
- 为什么 02000 的计算结果为 1024
- 为什么这两个相似的代码计算行列式的结果不同?
- C++ openmp 并行计算计算错误的结果
- 如何让编译器忽略这个计算结果为 false 的 if-constexpr?
- 从文本文件中读取并使用 sizeof 结果计算整数的数量到 nan