【问题标题】:While loop doesn't respect both conditions虽然循环不尊重这两个条件
【发布时间】:2018-02-21 22:53:00
【问题描述】:
int lim1, lim2, nr1, nr2;
lim1=1; lim2=1;
nr1=6; nr2=7;
while (nr1 != lim1 && nr2 != lim2) 
{
    nr1--; nr2--;
    cout << nr1 << ' ' << nr2 << endl;
}

为什么当 nr1 变为 1 时 while 会停止,而 nr2 不会。 &amp;&amp; 不应该意味着必须满足两个条件吗? nr2 在循环结束时不是 1 那么为什么不变成无限循环呢?

为什么这个循环会起作用?正如预期的那样,这是一个无限循环。

while (!(nr1 == lim1 && nr2 == lim2)) 
{
    nr1--; nr2--;
    cout << nr1 << ' ' << nr2 << endl;
}

这两个条件不是检查同一件事吗?

【问题讨论】:

  • 昨天我花了一整天的时间试图弄明白,但我就是想不通。
  • De Morgan's Law的可能重复
  • @Someprogrammerdude 是的,它不应该停止,因为不是两个数字都是 1。只有一个是。它应该无限地继续

标签: c++ while-loop conditional-statements


【解决方案1】:

nr11 时,那么nr22。因此,当nr1 != lim1 为假时,nr2 != lim2 仍然为真,但由于整个表达式为假(因为逻辑与),循环结束。这就是逻辑 AND 的工作原理,两个表达式都必须为真,整个表达式才能为真。

而且你在不同循环中的两个条件是不相等的。 De Morgan's laws 这么说

nr1 != lim1 && nr2 != lim2

等于

!(nr1 == lim1 || nr2 == lim2)

法律也这么规定

!(nr1 == lim1 && nr2 == lim2)

等于

nr1 != lim1 || nr2 != lim2

您还应该注意,整数没有“无穷大”。所有整数都是有限的。 int 类型在大多数系统上是一个 32 位有符号整数,这意味着它的范围约为 20 亿到负 20 亿。当有符号整数溢出或不足时,您将有未定义的行为

所以无限循环的最终结果是未定义的行为

【讨论】:

  • 未定义的行为是否意味着有一天它可以退出循环? :P
  • @p-a-o-l-o 谁知道?毕竟,它是undefined... 据我们所知,它甚至可以召唤nasal demons
  • @p-a-o-l-o 行为未定义...什么循环? ;)
【解决方案2】:

实际上这两个条件都做了它们应该做的事情,所以让我们分解它们。

首先

while(nr1!=lim1 &amp;&amp; nr2!=lim2) - 可以翻译成英文,只要 nr1 与 lim1 不同且 nr2 与 lim2 不同,就保持循环。

第二

while(!(nr1==lim1&amp;&amp;nr2==lim2)) - 可以翻译成英文 as,只要 nr1 和 nr2 分别不等于 lim1 和 lim2,就一直循环。

因为 nr1 和 nr2 被设置为 6 和 7,所以代码并没有完全按照您的意愿执行。这意味着在第一个 while 循环中,nr1 将首先到达 1,因此会中断循环。相反,对于第二个条件,它将始终评估为 true,因为 nr1 和 nr2 无法同时等于 lim1 和 lim2,因为 nr1 和 nr2 之间的差异为 1。

【讨论】:

    【解决方案3】:
    nr1 != lim1 && nr2 != lim2
    

    此语句为true,如果两者都有:

    • nr1lim1 不同
    • nr2lim2 不同

    所以如果不满足至少一个条件,您的程序将停止迭代


    nr1 == lim1 && nr2 == lim2
    

    仅当两个条件都满足时,此语句才为true。因此,如果至少有一个条件不满足,则语句变为false

    !(nr1 == lim1 && nr2 == lim2)
    

    所以现在如果你反转语句,这意味着如果语句是false,它将是true。所以有了这个条件,你就是在告诉你的程序:“只要至少有一个条件不满足,就继续迭代”。换句话说,您的程序将迭代直到满足这两个条件

    【讨论】:

      【解决方案4】:

      有一个简单的数学公式,叫做德摩根公式,上面写着

      在 C++ 中, 用 ! 表示。 用 $$ 表示, 用 || 表示。所以你的表达式必须转换为以下形式 !(nr1==lim1 || nr2==lim2) 等价于 (nr1!=lim1 && nr2!=lim2)

      【讨论】:

        猜你喜欢
        • 2016-05-18
        • 1970-01-01
        • 1970-01-01
        • 2011-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-14
        相关资源
        最近更新 更多