2016-12-27 85 views
1

我是新来的编程新手,所以在第一堂课中,我做了下面的代码,除了最后一个没有更新的“总武器”时,一切都很顺利。数量手枪。我明白数字手枪已更新,但在最后一行使用数字武器时,它不会显示新数值。C++ - 变量未更新

我还是不明白为什么,有人可以解释我并告诉我我做错了什么?

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

谢谢,最好的问候!

+2

你不是递增numberWeapons的价值 – Zeokav

+6

你不能写'INT numberWeapons = numberPistols + numberKnives;'​​在并且期望它在每次更改变量时进行更新。该行只执行一次,只执行一次。您需要在更改后手动更新'numberWeapons'。编写一个函数也是解决这个问题的典型方法,但是如果你只是将2个值加在一起,为这样一个小任务创建一个函数将会使逻辑错乱。 – Carcigenicate

+2

C++通过源代码自上而下运行程序。这个添加手枪和刀的线是该程序的第三条线,并且将在该点执行。 C++没有什么魔法可以回到那条线并重新计算任何东西。 – PaulMcKenzie

回答

0

在这个程序中,所有的语句都按顺序执行,每个语句只执行一次。 您必须重写或循环语句才能重复。

int numberPistols = 5; 
int numberKnives = 18; 
int numberWeapons = numberPistols + numberKnives; 

让我们做一个预演你的程序:

所有的
  • 首先,你必须声明的整型变量numberPistols并与值初始化它“5”。
  • 然后,您已声明整数类型变量numberKnives并用值'18'初始化它。
  • 在下一个声明中,您已声明变量numberWeapons并使用从numberPistolsnumberKnives之和中获得的值对其进行了初始化。
  • 打印所有变量后,你被1

错误递增的numberPistols值:

您已经更新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; 
} 
+0

不错!我正在尝试做其他人推荐的功能。非常详细的你的解释@M阿萨德阿里。非常感谢你。 – AnnakinBR

0

这也许不是你想要在你的第一个C++课学习的东西,但如果你使用C++ 11,你可以用它在增加了的numberPistolsnumberKnives当前值的lambda函数替换int numberWeapons你怎么称呼它的时候:

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

numberWeapons现在是该知道的numberPistolnumberKnives变量,从语句的[&numberPistols, &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; 
} 
+0

您可以用'[&]'替换'[&numberPistols,&numberKnives]',这意味着'[&everything]'。但是这意味着你的功能现在可以看到一切。总体而言,您不希望任何代码访问任何不需要的内容。通过编写'[&numberPistols,&numberKnives]'你明确地说明你的函数只对访问这两个变量感兴趣。 –

+0

如果你没有参数,你不需要有一个参数列表'()'。即'auto numberWeapons = [&numberPistols,&numberKnives] {return numberPistols + numberKnives; };' – MSalters

+0

@MSalters我不确定这篇文章的详细信息是否太多。现在添加它,到底是什么。 –

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只是重它指定它。

在“真正的”程序中,你会使用一个处理更新的函数,但我认为这只会掩盖逻辑听到,因为你只是将2个数字加在一起。

1

由于Carcigenicate已经评论,一个通常的方法是写一个函数

#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; 
} 
+1

为什么所有这些无用的getter和setter?放弃这些并不简单,只保留对OP的理解有重要意义? –

+1

你说得对,这绝对是夸张的。它只是让我一起... – marlam

0

变量是相互独立。为了向你解释,我们可以从苹果开始:

我给两个苹果露西。我给你三个苹果,并说:“我给你一个苹果加上我给露西的苹果数量。”然后,过了一段时间,我又给了露西另一个苹果。你有多少个苹果?

答案很简单:三个。就像C++中的变量或任何其他编程语言一样,你和Lucie拥有的苹果数量是相互独立的。变量彼此独立。

即使您使用变量计算另一个变量的值,变量值的变化也不会影响另一个变量的值。


如果您想要始终更新数字,该怎么办?

然后,你必须计算值每次。程序员通常用一个函数来做到这一点。在你的例子中,我们可以定义武器总数作为函数返回numberPistolsnumberKnives。以下是我想做到这一点:

#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类型的变量,而是一个功能。您必须使用()运算符调用该函数。

+0

我尝试像你推荐的,出于某种原因不能正常工作,我不明白为什么...我使用的是Dev-C++ 5.11。请参阅下面的错误 C:\ logs \ main.cpp在函数'int main()'中: 9 7 C:\ logs \ main.cpp [错误]'computeNumberWeapons'没有指定类型 17 62 C :\ logs \ main.cpp [Error]'computeNumberWeapons'未在此范围内声明 28 C:\ logs \ Makefile.win目标'main.o'的配方失败 – AnnakinBR

0

我的理解,也尝试了不同的代码的你在这里发布的人,其中一人给我错误,当我试图合作mpile并运行(下面是代码)。我正在使用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 +编译器,我使用让我觉得如果这是这是错误的或东西安装的时候,我做错了,并启动了一个项目里面的代码...

Error Image

0

好吧,让像下面的函数之前INT主要()

//function for calculating numberWeapons 
int totalWeapons(int numberPistols, int numberKnives){ 
    return numberPistols+numberKnives; 
} 

添加此功能,并添加下面无论你想更新numberWea给出的行脑桥:

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