如果i = 9,为什么--i不在C while循环中打印0,而i--打印从8开始的0?[副本]

lkaoscv7  于 9个月前  发布在  其他
关注(0)|答案(4)|浏览(105)

此问题已在此处有答案

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。按照前递减和后递减规则,为什么第二个代码给出这样的输出?

rm5edbpk

rm5edbpk1#

i = 1;
while (--i) // evaluates to while (0)
// condition is false so the while loop stops
i = 1;
while (i--) // evaluates to while (1), afterwards i gets decremented to 0
// condition is true so we enter the loop body
o2gm4chl

o2gm4chl2#

两个版本的区别在于while如何测试是否保持迭代。在前增量版本中,它测试递减的值,在后增量版本中,它测试原始值。
在这两种情况下,打印发生在增量之后,因此它从8开始。区别在于是否打印0 shell 。

8tntrjer

8tntrjer3#

任何循环都可以写成无限循环(while (1)),将循环内的条件作为if语句移动,即当终止条件为真时,break是循环。下面两段代码是等效的:

while (condition) {
  do-something
}
while (1) {
  if (! condition) {
    break;
  }
  do-something
}

让我们这样重写第一个循环。

int i;

i = 9;
while (1) {
  if (! (--i)) {
    break;
  }

  printf("%d", i);
}

但是-- i意味着i = i - 1,那么i被计算。这意味着上面的循环等价于:

while (1) {
  i = i - 1;
  if (! i) {
    break;
  }

  printf("%d", i);
}

! ii == 0相同,因此循环变为:

int i = 9;

while (1) {
  i = i - 1;
  if (i == 0) {
    break;
  }

  printf("%d", i);
}

现在很明显,i的初始值(即9)没有被打印出来,因为i在被打印出来之前被递减了(如果循环在那次迭代中没有结束的话)。同样清楚的是,值0没有被打印出来,因为在以i == 0开始的迭代中,if条件变为true,循环结束。
类似地,因为i --意味着 “首先计算i,然后递减它”,所以使用i --的循环等价于:

int i = 9;

while (1) {
  if (i == 0) {
    break;
  }
  i = i - 1;

  printf("%d", i);
}

在这个循环中,值9也没有被打印,但是0被打印,因为打印内容的最后一次迭代是从i == 1开始的。然后递减并打印,然后循环结束于下一次迭代(从i == 0开始)。

zpjtge22

zpjtge224#

i = 9;
while (i--) { // 1
    printf("%d", i); 
}
  1. i是“真理测试”,在这里减少了一个。如果它是用值9测试的,它会减少,在循环中会变成8。如果它是用值1测试的,它在循环内将是0。

相关问题