2016-03-17 158 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。 –