【问题标题】:How to stop execution of a while loop's condition, if the condition fails如果条件失败,如何停止执行while循环的条件
【发布时间】:2012-04-13 12:55:08
【问题描述】:

我有一个 while 循环,循环条件如下:

while (i != repetitionString.Length || !repetitionString[i].Equals(')'))

条件的第一部分检查是否未到达集合的末尾。 ||后面的部分在左侧条件不满足后是否可以不执行?这背后的原因是,如果左侧的条件不满足,那么这意味着集合超出范围,因此右侧的评估/检查将抛出异常。

可以这样做吗?

【问题讨论】:

  • || 是短路的,所以应该默认这样做。
  • @asawyer 不是用于错误的左值,而是使用 AND。 OR 只会在左操作数为真时短路。反之,AND只会在左操作数为假的情况下短路。
  • 为了完整起见...短路在 VB.NET 中的工作方式不同。在 VB.NET 中,And 和 Or 运算符不会短路。您必须使用 AndAlso 和 OrElse 运算符来获得短路行为。这与 VB6 一致,VB6 也没有短路 And 和 Or 运算符。
  • @asawyer 问题是在未设置左侧操作时不调用右侧(假)。

标签: c# .net oop while-loop


【解决方案1】:

这无论如何都会发生 - 右侧的布尔条件只有在左侧的计算结果为 false 时才会执行。您也可以强制使用二进制逻辑(单个|)执行正确的语句,但这并不是您想要做的,因此您当前的语句会执行得很好。

看起来你真正想要的是:

while (i < repetitionString.Length && repetitionString[i]!=")")
{

}

【讨论】:

  • 我几乎说了同样的话,但仔细阅读后,我认为 OP 想要相反。他希望只有在满足左边的情况下才评估右边。
  • @Justin,但逻辑似乎另有规定。首先检查我们没有到达字符串的末尾,然后检查当前字符也不是)。我认为令人困惑的是 OP 使用“未满足左侧条件”这一短语——我认为他说“未满足”是因为他使用的是 != 运算符。
  • 不幸的是,它没有发生。即使第一个条件不满足,调试器也证明它仍会转到右侧。
【解决方案2】:

您只需使用 && 代替 ||。因为只有当第一个返回 true 时才应该检查正确的条件。

【讨论】:

  • 谢谢,这实际上是我已将其更改为的内容,并且现在可以使用了 :) 我一定是太累了,因为它现在比较容易弄清楚并且有意义!
【解决方案3】:

短路已经发生。

我的猜测是 repetitionString 是一个从零开始的索引,而 .Length 返回总计数。因此,您需要修改 if 以保持界限:

while (i != (repetitionString.Length - 1) || !repetitionString[i].Equals(')'))

【讨论】:

    【解决方案4】:

    这看起来相当于:

    if (attribute != null || attribute.value != null)
    

    因为你不能用

    if (attribute.value != null) 
    

    因为这会在属性 == null 时引发错误,所以我认为您的代码是正确的?

    当条件

    i != repetitionString.Length
    

    满足,代码会跳过||之后的部分

    因为它是一个OR表达式,所以当条件的第一部分返回true时,不需要检查条件的第二部分。

    当您使用 && 而不是 || 时,将始终检查这两个条件。这不是你想在这里做的。

    【讨论】:

      猜你喜欢
      • 2017-12-14
      • 2021-12-12
      • 2011-01-09
      • 2017-02-09
      • 1970-01-01
      • 2023-04-03
      • 2017-07-04
      • 2022-06-10
      • 2019-01-29
      相关资源
      最近更新 更多