此问题已在此处有答案:
What is the difference between i and i?(20个回答)
上个月关门了。
int i;
i = 9;
while (--i)
{
printf("%d", i);
}
上面的代码打印87654321。(这意味着递减在打印之前首先发生,因为我们在i之前有预递减符号,并且我们不打印0,因为while循环将0评估为false。
那么,为什么在下一段代码中,输出从8开始,到0结束?(876543210)
int i;
i = 9;
while (i--)
{
printf("%d", i);
}
由于第二个代码有一个后递减,我希望它从9开始打印,而不是在末尾打印0,因为第一个例子中的while循环将0评估为false。按照前递减和后递减规则,为什么第二个代码给出这样的输出?
4条答案
按热度按时间rm5edbpk1#
o2gm4chl2#
两个版本的区别在于
while
如何测试是否保持迭代。在前增量版本中,它测试递减的值,在后增量版本中,它测试原始值。在这两种情况下,打印发生在增量之后,因此它从
8
开始。区别在于是否打印0
shell 。8tntrjer3#
任何循环都可以写成无限循环(
while (1)
),将循环内的条件作为if
语句移动,即当终止条件为真时,break
是循环。下面两段代码是等效的:让我们这样重写第一个循环。
但是
-- i
意味着i = i - 1
,那么i
被计算。这意味着上面的循环等价于:! i
与i == 0
相同,因此循环变为:现在很明显,
i
的初始值(即9
)没有被打印出来,因为i
在被打印出来之前被递减了(如果循环在那次迭代中没有结束的话)。同样清楚的是,值0
没有被打印出来,因为在以i == 0
开始的迭代中,if
条件变为true,循环结束。类似地,因为
i --
意味着 “首先计算i
,然后递减它”,所以使用i --
的循环等价于:在这个循环中,值
9
也没有被打印,但是0
被打印,因为打印内容的最后一次迭代是从i == 1
开始的。然后递减并打印,然后循环结束于下一次迭代(从i == 0
开始)。zpjtge224#
i
是“真理测试”,在这里减少了一个。如果它是用值9测试的,它会减少,在循环中会变成8。如果它是用值1测试的,它在循环内将是0。