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这两个条件检查同样的事情?
答案 0 :(得分:3)
当nr1
为1
时,nr2
为2
。因此,当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}}
nr1
与lim1
nr2
与lim2
所以如果至少满足一个条件,你的程序将停止迭代。
nr1 == lim1 && nr2 == lim2
只有在满足两个条件的情况下,此语句才为true
。因此,如果不满足至少一个条件,则该语句变为false
。
!(nr1 == lim1 && nr2 == lim2)
所以现在如果你颠倒语句,就意味着如果语句是true
,它将是false
。因此,在这种情况下,您告诉您的程序:“只要至少满足其中一个条件,就继续迭代”。换句话说,您的程序将迭代,直到满足两个条件。