2016-12-27 90 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; 
}