2013-10-29 151 views
2

我剛纔提出這個方案,其中要求5和10,然後計算其在此輸入的數字之和輸入號碼是代碼爲什麼我需要初始化一個int變量爲0?

#include <iostream> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
    int a,i,c; 
    cout << "Enter the number between 5 and 10" << endl; 
    cin >> a; 
    if (a < 5 || a > 10) 
    { 
     cout << "Wrong number" << endl; 
     system("PAUSE"); 
     return 0; 
    } 
    for(i=1; i<=a; i++) 
    { 
     c=c+i; 
    } 
    cout << "The sum of the first " << a << " numbers are " << c << endl; 
    system("PAUSE"); 
    return 0; 
} 

如果我輸入號碼5應該顯示

第一5個數字的總和是15

但它顯示

第5個數字的總和是2293687

但是當我設置C至0

它的工作原理corectly

那麼有什麼區別?

回答

12

因爲C++不會自動爲您設置爲零。所以,你應該自己初始化:

int c = 0; 

未初始化的變量具有隨機數,例如2293687-2199999,...(如果在讀時,它不會調用未定義行爲

另外,static變量將被設置爲其默認值。在這種情況下,0

+0

如果c是像你寫的那樣聲明和初始化的,它會坐在棧區嗎? –

+0

@ tomer.z:這取決於你寫的地方。例如,在全球範圍內或在函數聲明中... – deepmax

3

如果您沒有將c設置爲0,它可以採用任何值(技術上,一個不確定的值)。如果你這樣做

c = c + i;

然後您將i的值添加到可能是任何東西的東西。從技術上講,這是未定義的行爲。在實踐中發生的事情是你不能依賴這個計算的結果。

在C++中,非靜態或全局內置類型在「默認初始化」時沒有執行初始化。爲了零初始化int,你需要明確:

int i = 0; 

,或者您可以使用值初始化

int i{}; 
int j = int(); 
0

第5個數字的總和是2293687

這是因爲沒有初始化c您獲得的值先前存儲在該lo陽離子(垃圾值)。這會使未定義的程序行爲。在程序中使用之前,您必須初始化c

int c= 0; 
0

因爲當你這樣做:

int a,i,c; 

從而實例化和初始化c,你還沒說你想要什麼初始化。這裏的規則有點複雜,但它歸結爲兩點:

  1. 對於整型,如果不指定初始化的變量的值是不確定
  2. 當您嘗試讀取未初始化的變量,則引發未定義的行爲
+0

對不起!我想編輯我的,但意外編輯你的。 – haccks

2

根據定義,非靜態變量未初始化 - 它們的初始值未定義。

在另一個編譯器上,您可能每次都得到正確的答案,錯誤的答案或不同的答案。

C/C++不會做額外的工作(初始化爲零涉及至少一個或兩個指令),而您並沒有要求他們這樣做。

相關問題