2013-11-09 54 views
2

所以,據我瞭解,do while循環總是會運行至少一次?但是,如果是這種情況,爲什麼我們需要在循環之外聲明和初始化變量?Java中的Do-While循環

就拿下面的代碼:

do { 

    int a = (int) (Math.random() * 13); 
    int b = (int) (Math.random() * 13); 
    int c = (int) (Math.random() * 13); 
    int d = (int) (Math.random() * 13); 

    } 

    while (a + b + c + d != 24); 

這將拋出一個編譯錯誤是A,B,C,d可能沒有被初始化。由於我是一名java初學者,我確信有一個簡單的原因,但我似乎無法找到它?!

非常感謝任何幫助。

+3

查找**變量的作用域**,因爲這是你的問題:你想訪問他們的申報範圍之外的變量,這裏是do-while循環,這是無法完成的。 –

回答

3

查找變量範圍因爲這是你的問題:你試圖訪問他們聲明的範圍之外的變量,這裏是do-while循環,這是不能做到的。

請注意您的代碼將工作,如果你引入一個新的變量:

int sum = 0; // scope is *outside* of do-while loop 
do { 
    int a = (int) (Math.random() * 13); 
    int b = (int) (Math.random() * 13); 
    int c = (int) (Math.random() * 13); 
    int d = (int) (Math.random() * 13); 
    sum = a + b + c + d; 
} while (sum != 24); 

但請注意,如果你現在仍然需要訪問的a,b,c和d值,你不能。爲了讓這個,再次,你應該在之前聲明你的變量循環。

+0

好的,所以當我在do {}部分聲明變量時,變量在其他地方是不可訪問的? – Dobhaweim

+0

@Dobhaweim:是的。其知名度僅限於其宣佈範圍*。再次,查看該術語是理解Java變量的關鍵。 –

+1

範圍由'{'和'}'確定。這些變量在由'{'和'}'分隔的塊中聲明,它們只存在於塊中。 'while'在塊之外。 – Jesper

1

這可以重新寫成這樣

int a = (int) (Math.random() * 13); 
int b = (int) (Math.random() * 13); 
int c = (int) (Math.random() * 13); 
int d = (int) (Math.random() * 13); 

while (a + b + c + d != 24){ 
a = (int) (Math.random() * 13); 
b = (int) (Math.random() * 13); 
c = (int) (Math.random() * 13); 
d = (int) (Math.random() * 13); 
//do something 
} 
0
do { 

    int a = (int) (Math.random() * 13); 
    int b = (int) (Math.random() * 13); 
    int c = (int) (Math.random() * 13); 
    int d = (int) (Math.random() * 13); 

    } 

    while (a + b + c + d != 24); 

這是一個範圍的問題。看看jls 6.3. Scope of a Declaration

你想重新寫代碼,像這樣:

int a = 0; //I am being explicit here 
int b = 0; 
int c = 0; 
int d = 0; 
do { 

     a = (int) (Math.random() * 13); 
     b = (int) (Math.random() * 13); 
     c = (int) (Math.random() * 13); 
     d = (int) (Math.random() * 13); 

     } 

     while (a + b + c + d != 24);