2012-08-02 94 views
6

這是我會怎麼做while循環:是否可以在條件中聲明變量?

boolean more = true; 
while (more) 
{ 
    // do something 
    if (someTest()) 
    { 
    more = false; 
    } 
} 

這是相當標準。我很好奇,想知道是否有下面在Java中做類似的代碼的東西的一種方式:(我想我已經看到了用C類似的東西)

// The code below doesn't compile (obviously) 
while (boolean more = true) 
{ 
    // do something 
    if (someTest()) 
    { 
    more = false; 
    } 
} 

我只要求這一點,因爲目前我不t就像我定義條件中使用的變量的方式(在這種情況下:「more」)外部的循環的範圍,儘管它只與內部的內部循環有關。循環結束後沒有任何意義。


*更新*以祕密的Porcaline商會訪問之後

的想法來找我:

for (boolean more=true; more; more=someTest()) 
{ 
    // do something 
} 

它並不完美;它濫用for循環,我想不出一種方式來執行至少一次循環,但它接近...有沒有辦法確保循環執行1次?

+1

for(boolean more = true; more; more = someTest())...將始終執行至少一次。 – Pyrce 2012-08-02 17:40:05

回答

9

要字面上回答你的問題,你可以做

for(boolean more = true; more;) { 
    more = !someTest(); 
} 

但這是一樣一樣的

while(!someTest()); 

如果必須執行至少一次,你可以做

do { 

} while(!someTest()); 
+2

'for(var; cond;)'技巧在處理迭代器時很有用:'for(Iterator it = list.iterator(); it.hasNext();){/ * do stuff */}'。實際上,它推薦用於* Effective Java Item 45:最小化本地變量的範圍* – Xaerxess 2012-08-02 17:41:35

+0

您提供的答案與我提交的更新一樣。謝謝! ......這可能是我的一個糟糕的想法,將條件抽象爲一種方法 - 循環只有三行,其中一個設置「更多」,因此將其封裝在一個方法中會過度。我認爲這會讓問題更加簡潔,但卻讓它容易被誤解。我的錯。 – KidTempo 2012-08-02 17:49:00

1

針對您的特殊情況下,可以降低代碼的這樣:

while (true) { 
    if (someTest()) { 
    break; 
    } 
} 

在一般情況下,你可以用一個內部範圍的更換你的外部範圍的聲明,但你需要移動循環條件:

while (true) { 
    boolean more=true; 
    ... 
    if (someTest()) { 
    more = false; 
    } 
    ... 
    if (!more) { 
    break; 
    } 
} 

甚至:

do { 
    boolean more=true; 
    ... 
    if (someTest()) { 
    more = false; 
    } 
    ... 
    if (!more) { 
    break; 
    } 
} while (true); 

我認爲現時定義你的條件outsi循環更清晰。

+0

+1或'while(!someTest()){}' – 2012-08-02 17:34:44

+0

說實話,我並不是很喜歡用'while(true){...}'這看起來像是一個cop-out 。另外我還有調試其他人的意大利麪條代碼亂七八糟的'if(false){...}([顫抖] – KidTempo 2012-08-02 17:52:41

0

KidTempo,在你給出的例子中,我認爲每次循環中都會重新初始化更多。每次通過循環時,都會重新評估條件,因此假設您可以在條件中定義變量,則每次重新評估條件時都會重新初始化變量。這也適用於其他類型的條件,所以我會說避免在條件中定義變量。