2012-08-02 93 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,在你给出的例子中,我认为每次循环中都会重新初始化更多。每次通过循环时,都会重新评估条件,因此假设您可以在条件中定义变量,则每次重新评估条件时都会重新初始化变量。这也适用于其他类型的条件,所以我会说避免在条件中定义变量。