【问题标题】:Return which condition terminated a loop返回哪个条件终止了循环
【发布时间】:2017-08-10 00:01:32
【问题描述】:

假设我有以下 while 循环:

int var1 = 3, var2 = 1;
while (var1 != 0 && var2 != var1) {
    var1--;
}

知道哪个条件导致循环结束的最优雅的方法是什么?

【问题讨论】:

  • “知道哪个条件导致循环结束的最优雅的方法是什么?”。好吧,因为您使用的是逻辑“或”,如果两者都为假,则循环将终止,所以这就是您的答案。
  • 我搞砸了,意思是 两个条件都为真
  • 任何。我想要的是一种让 while 循环告诉我哪些条件没有满足的方法。
  • 仅供参考,您接受后我更新了我的答案。 result2 对你没有帮助...
  • 是的,我明白你的意思; & 评估这两个条件,&& 没有。我已经在做#2了,只是想知道是否有一种“内置”方式可以“告诉你”什么条件没有得到满足,而不是你需要用布尔值来跟踪它们。

标签: java loops conditional-statements


【解决方案1】:

您的选择基本上是:

  1. 之后再次检查,或

  2. 将信息保存到变量中。

这里是#2:

int var1 = 3;
int var2 = 1;
boolean result1;
boolean result2 = false;
while ((result1 = var1 != 0) && (result2 = var2 != var1)) {
    var1--;
}

注意,您需要在 result2 上设置一个默认值(如果您愿意,可以使用 true,无论代码中是否有意义)因为 && 短路,这意味着如果第一个操作数不正确,则永远不会计算第二个操作数,编译器会抱怨 result2 可能尚未初始化。

其实你只需要result1(因为result2不会更新如果result1false,所以它并没有真正告诉你什么;如果result1false,@ 987654333@ 的值将来自 previous 循环[或默认值])。这样做可能会更好:

int var1 = 3;
int var2 = 1;
boolean result1;
while ((result1 = var1 != 0) && var2 != var1) {
    var1--;
}
if (result1) {
    // It was the "var2 != var1" condition that ended the loop
} else {
    // It was the "va1 != 0" condition that ended the loop
}

如果您出于某种原因想要始终评估这两个选项,例如Bubletan points out,您可以使用&,它(带有布尔值)就像&&,只是它不会短路:

int var1 = 3;
int var2 = 1;
boolean result1;
boolean result2;
while ((result1 = var1 != 0) & (result2 = var2 != var1)) {
    var1--;
}

【讨论】:

  • 另一种方法是使用& 而不是&&
猜你喜欢
  • 2010-09-13
  • 2017-02-09
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多