2012-12-28 58 views
1

我是新的C++和跨越這來了:C++的變量範圍

for (int i=0 ; i<500 ; i++) { 
     //to do 
    } 

    int i; 
    std::cin >> i; 

更新:使用Visual Studio 2010(和它使用的編譯器)外的for循環的值爲500後的第i打電話給我>>我;我使用Visual Studio調試器< <(這是問題 - 感謝格雷格)看值

現在我期待

一)INT I; for循環之外,int i = 0;是不同的變量,也就是說,for循環i在大括號關閉時超出範圍

b)一旦我意識到它沒有超出範圍,我想知道爲什麼它不會被cin覆蓋。我認爲b)是故意的(雖然我很難在Bjarne Stroustrup的C++書中找到它的頁面),但我確定它在同一本書中聲明變量在括號中包含範圍

在大多數其他語言中,我知道在for構造中聲明變量時,它們被認爲是在for循環的大括號中,但在C++中,這似乎不是這種情況。

是這樣的話,是這個特定的for循環或是否有任何其他情況下,出現這種情況(我想不出任何其他的,但嘿我是新)

感謝

+3

什麼使你相信它不會超出範圍? for循環中的'i'只在for循環中有效。 – chris

+3

除非您使用的舊版Microsoft編譯器沒有正確實現規範。 –

+0

@GregHewgill,對,我想我對這樣做有點微弱的記憶。你確認了它。 – chris

回答

3

在某些情況下,特別是在這種情況下,你必須在同一個函數兩個不同的變量具有相同的名稱,你不能總是相信調試器給你正確的信息。如果您要求i的值,那麼調試器可能不知道您指的是哪個i。從你所描述的,聽起來像編譯器已經爲每個不同的i實例分配了兩個不同的內存位置。

我經常用這個原理當有疑問時,多打印一下。如果使用std::cout << i,則應該看到實際i,該值在打印輸出的範圍內。

+0

感謝格雷格 - 我一直希望調試器向我展示正確的變量,但可以明白爲什麼現在不會在這種情況下。標記爲答案,並感謝您的幫助 –

0

假設一致性(並且編譯器不符合該點很可能會給出編譯錯誤),那麼您的兩個i是不同的。但是沒有任何東西阻止編譯器爲兩者使用相同的內存位置,因爲它們的生存時間也是截然不同的,因此第二個i以最初的值開始,因爲它沒有被初始化。

cin >> i不允許您輸入新值的事實與此無關。你不會提供足夠的信息來做更多的猜測(我的猜測是流處於錯誤狀態)。

+0

我已經重新測試,你看到的程序是「全部」 - 它不寫我的,但如果我改變變量outisde的爲j調用cin >> j確實按預期工作。 –

+0

你的程序不完整,不能編譯。輸入後你怎麼知道'i'是500?如果是通過使用調試器,那麼隨着描述的其餘部分,我的第一個賭注就是編譯器不使用相同的內存位置,調試器會對您想要的哪一個感到困惑。 – AProgrammer

+0

該程序缺少它的主要功能 - 這是假設它顯然不是沒有它的完整程序。將我的代碼放在'main'中,包含std命名空間並將其編譯。 –

0

我認爲這是因爲2nd i沒有初始化,編譯器爲第二個i使用相同的內存塊。 他們仍然是不同的兩個變量。是的,第一個我被挖到循環。 因此,這是不確定的,你不能在第二指望我給500。

for (int i=0 ; i<500 ; i++) { 
    //to do 
} 

int i=0; // initialize i 
std::cin >> i; 
+0

結果如預期的工作 - 只是調試器顯示我有相同的價值,但cout <<我確認cinit >> i後uninitialisation和正確的值。感謝無論如何:) –

1

嗯,很多答案,甚至一個選擇「解決方案」。

但無論如何,用Visual C++ 10.0問題(隨Visual Studio 2010中,編譯器)是默認爲它可以被配置成預先標準行爲,其中,在for循環聲明的變量的範圍伸出循環被放置在塊

你要這個選項。

/Zc:forScope,wchar_t 

這使得標準C++ for -scope以及內置wchar_t型,並且希望此:

/GR 

其使得RTTI(即, dynamic_casttypeid)。

只是爲了得到作爲標準,你可以,你還想要這個鏈接器選項:

/entry:mainCRTStartup 

啓用GUI子系統程序的C++標準main,當然要啓用異常處理,但我回想一下默認啓用的Visual C++項目(儘管不適用於命令行編譯器)。

另外,當然,您希望通過/W4儘可能多地發出警告,儘管這與標準一致無關。

但無論如何,總結,原因你得到奇怪的for範圍是最可能是由於編譯器和/或Visual Studio項目違約已被設置爲舊的預標準規則,併爲選擇,是/Zc:forScope

+0

雖然沒有解決我遇到的問題(它基本上是調試器顯示我screwy值,我沒有檢查/ Zc:forScope選項正確設置(默認))這實際上是非常好的幫助新手(我)理解並正確設置+1,謝謝 –