虽然循环不同时遵循这两个条件

时间:2018-02-21 09:02:28

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

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时会停止,但nr2不会。不是&&应该意味着必须满足两个条件吗? nr2在循环结束时不是1,那为什么它不会变成无限循环呢?

为什么这个循环有效?正如预期的那样,这是一个无限循环。

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

Aren这两个条件检查同样的事情?

4 个答案:

答案 0 :(得分:3)

nr11时,nr22。因此,当nr1 != lim1为假时,nr2 != lim2仍为真,但由于整个表达式为假(因为逻辑AND),循环结束。这就是逻辑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亿。当有符号整数过流或欠流时,您将具有未定义的行为

因此,无限循环的最终结果是未定义的行为

答案 1 :(得分:0)

有一个简单的数学公式,称为De Morgan公式,其中说

在C ++中,用!表示。用$$表示,用||表示。因此,您的表达式必须转换为以下形式 !(nr1 == lim1 || nr2 == lim2)与(nr1!= lim1&amp;&amp; nr2!= lim2)等价

答案 2 :(得分:0)

实际上这两种情况都是他们应该做的,所以让我们分解它们。

第一

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

第二

while(!(nr1==lim1&&nr2==lim2)) - 可以翻译为英语,只要nr1和nr2分别不等于lim1和lim2,就保持循环。

代码并没有完全按照你想要的那样做,因为nr1和nr2被设置为6和7.这意味着在第一个while循环中,nr1将首先到达1,因此将打破循环。相反,对于第二个条件,它将始终求值为true,因为nr1和nr2无法分别等于lim1和lim2,因为nr1和nr2之间存在1的差异。

答案 3 :(得分:0)

nr1 != lim1 && nr2 != lim2

如果两者都是true,则该语句为<{p}}

  • nr1lim1
  • 不同
  • nr2lim2
  • 不同

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

nr1 == lim1 && nr2 == lim2

只有在满足两个条件的情况下,此语句才为true。因此,如果不满足至少一个条件,则该语句变为false

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

所以现在如果你颠倒语句,就意味着如果语句是true,它将是false。因此,在这种情况下,您告诉您的程序:“只要至少满足其中一个条件,就继续迭代”。换句话说,您的程序将迭代,直到满足两个条件