当变量之一稍后更新时,计算结果不会更改

Result of calculation is not changed when one of the variables is updated later

本文关键字:结果 计算 变量 更新      更新时间:2023-10-16

在以下代码中,除最后一个"武器总计"外,一切都很好。当我将 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,并以从numberPistolsnumberKnives的总和获得的值初始化了它。
  • 打印了所有变量后,您将numberPistols的值数递减1。

错误

您已更新了numberPistols,但您尚未再次更新numberWeapons。更改numberPistolsnumberKnives的值不会影响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,该功能在调用它时累加numberPistolsnumberKnives的当前值:

  auto numberWeapons = [&numberPistols, &numberKnives]() {
    return numberPistols + numberKnives;
  };

numberWeapons现在是一个函数,从语句的[&numberPistols, &numberKnives]部分中知道numberPistolnumberKnives变量。它不需要参数-()-它返回两个变量的总和。

(实际上,()可以在此处省略,因为它们是空的,没有关于此功能的论点,但是我将它们留在其中,因为它使其更具识别为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;
}