2016-04-22 135 views
0

我想了解的for循環通過測試出以下三個實施例的範圍:範圍for循環具有替代變量聲明改變:

實施例1:

int a=15; 
for(a=1;a<3;a++) { 

    cout<<a<<endl; 
} 

cout<<a<<endl; 

這裏控制檯顯示1 2 3.但是,我會認爲它應該顯示1 2 15,因爲通常情況下,for循環內的變量a的範圍似乎仍保留在for循環內。

實施例2:

for (int a=1; a<3; a++) { 

    cout<<a<<endl; 
} 

cout<<a<<endl; 

在該示例中,編譯器不識別變量a之後的for循環 - 如預期。那麼它如何在例1中被認識到呢?

實施例3:

int a=15; 
    for(int a=1;a<3;a++) { 

     cout<<a<<endl; 
    } 

    cout<<a<<endl; 

在這種情況下,控制檯顯示1 2 15是什麼這和實施例1之間的差異?

非常感謝您的幫助。

回答

3

分析你的例子1:

int a=15; 

這行聲明一個變量a。這個變量可以被讀取或寫入。它是有效的,直到它宣佈的塊結束。這裏沒有可見的塊。在真正的程序中,塊是{}之間的代碼。

for(a=1;a<3;a++) { 
    cout<<a<<endl; 
} 

在這些行中,您可以從第一行修改該變量。它仍然是相同的變量,它只是變化的變量的。想象一下像一張紙那樣的變量。表單一直保持不變,只是你用鉛筆在上面寫了不同的數字,然後用橡皮膠擦掉它們。

cout<<a<<endl; 

由於沒有相應},變量a這裏依然可見。在一個字


實施例3不同於實施例1:在for迴路int。這int是一個新的變量聲明。現在你有兩個變量名爲a。使用紙張類比,您只需抓住另一張紙並將其放在第一張紙上。第一張紙因此變得不可見。

for循環的末尾,在關閉處}處,您拿起上面的紙張(此時已寫入數字3)並將其扔入垃圾桶。這使得外部紙張再次出現,其仍然具有寫在其上的值15。

2

在示例1中,您聲明a超出for循環的範圍,然後不重新聲明它(即int a)。出於這個原因,循環內部和外部的變量a是相同的。在第一次迭代中,它是1,然後增加到2.它仍然符合for循環標準,因此它再次執行,然後遞增到3.現在,a不符合for循環標準,因此它將離開循環顯示值爲3.最後,再次打印,其值爲3.

在示例2中未在循環外識別出a的原因是a從未在循環外聲明。它是for循環的本地變量,因此不在該循環外的任何範圍內。

在示例3中,當您在for循環聲明中說int a = 1而不是a = 1時,第二次聲明a。這意味着for循環的本地地址爲a,而在此循環之外有一個a,它在循環執行之前保持其值,因爲它們是兩個不同的變量 - 它們具有相同的名稱但範圍不同。

+0

謝謝!但是,爲什麼對於示例1,for循環內的'a'的修改會在for循環之外進行? @FCo –

+1

這是因爲循環內部的「a」與循環外部的「a」完全相同。對變量值的任何修改仍然成立。它們是相同的,因爲'for'循環聲明中沒有重新聲明'a'。 – FCo

1

解決方案對於實施例1: 在第一個例子您已聲明變種「A」在第一行即前for循環被執行時,初始值是15,但然後在for循環你把它初始化爲1, for循環迭代兩次,從而得到1和2.在第三次迭代中,'a'遞增,因此現在a = 3,但條件失敗,因爲'a'不小於3,所以它在末尾打印3。

解決方案對於實施例2: 作爲變量聲明在for循環在其範圍內位於for循環本身因而變量不是loop.Thus錯誤

解訪問外部。實施例3: Ex1和Ex3之間的區別是在例3中我們有兩個'a'的副本,一個是for循環的外部值,它的值是15,另一個是for循環的範圍在for循環內部。所以在循環var' a'結果爲1 2作爲輸出,外部變量a結果爲15。