2016-03-17 243 views
1

我正在尋找更好的替代方案,以下代碼。假設一些常用的編程語言(C/C++,JAVA,...):替代「while」循環

1)

while(true) { 
    foo = ... something ugly ... 
    if(foo == null) break; 
    ... some code 
} 

不是很好,因爲使用一個循環,直到永在可能成爲 「迷失」 休息一些代碼的中間。

2)

foo = ... something ugly ... 
while(foo != null) { 
    ... some code 
    foo = ... something ugly ... 
} 

不是很好,因爲分配給 「foo」 被複制。同樣在這種情況下:

2B)

for(foo = ... something ugly ...; 
    foo != null; 
    foo = ... something ugly ...) { 
    ... some code 
} 

3)

goto INIT: 
while(foo != null) { 
    ... some code 
    INIT: foo = ... something ugly ... 
} 

「GOTO」 到一個循環的中間。

4)

do { 
    foo = ... something ugly ... 
    if(foo != null) { 
    ... some code 
    } 
} while (foo != null) 

條件被複制。

這似乎很奇怪,所以很常見沒有很好的實現。

+0

選項4有什麼問題? – biziclop

+0

選項1有什麼問題? – SLaks

+0

@biziclop:條件「foo!= null」必須重複。如果條件比較複雜,或者是對另一個函數的調用,則可能是一個問題。 –

回答

4

通常這是通過:賦值運算符=只是賦值的

Foo foo; 
while ((foo = getSmthUgly()) != null) { 
    //... 
} 

結果,所以它也可以在表達式中使用。無論什麼醜陋只是分開的方法。

+0

在C/C++中是真的,我認爲在Java中是不可能的。 –

+2

@pasabaporaqui絕對有可能。 –

+0

@pasabaporaqui爲什麼在Java中不應該這樣做。只要getSmthUgly不是太難看,這可能是最好的解決方案。 – ctst

2

與Sasha的解決方案類似,但我傾向於使用for來限制變量的範圍。一個例子是當從BufferedReader讀取行時

try (BufferedReader br = new BufferedReader(new FileReader(filename)) { 
    for(String line; (line = br.readLine()) != null;) { 
     doSomething(line); 
    } 
    // line is out of scope here. 
} 
+1

很高興知道一個「for」的第一部分只能用於聲明一個局部變量,沒有init。 –