为什么在第一次迭代中 n 的值等于 5?

Why is the value of n equal to 5 in the first iteration?

提问人:Yogi Patel 提问时间:2/12/2022 更新时间:2/13/2022 访问量:68

问:

我有一个问题,为什么在第一次迭代中使用的 n 值是 5 而不是 6。我在 stackeoverflow 上检查了它,他们中的许多人说在第一次迭代中使用了 n 的值,然后将其减少 1 并在下一次迭代中使用。

#include <stdio.h>

int main()
{
    int ans = 1, n = 6;

    while (n--)
    {
        printf("n = %d\n", n);

        if (n != 0)
        {
            ans *= n;
        }
    }

    printf("ans = %d", ans);

    return 0;
}



Output:
n = 5
n = 4
n = 3
n = 2
n = 1
n = 0
ans = 120
C if-statement while 循环 赋值运算符

评论

3赞 kaylum 2/12/2022
n--将值从 6 递减到 5。在打印 so 之前运行。printf5
0赞 WhozCraig 2/12/2022
阅读: C 递增/递减运算符
2赞 kaylum 2/12/2022
"他们中的许多人说,在第一次迭代中使用了 N 的值,然后将其减小了 1”。我认为你误解了这一点。Indeed 在递减之前使用,但仅用于语句。之后的所有内容都将看到递减的值。nwhile

答:

1赞 pmg 2/12/2022 #1
n = 6;
while (n--) {
    // n is 5, then 4, 3, 2, 1, 0, then the while terminates
}
// n is -1

n = 6;
while (--n) {
    // n is 5, then 4, 3, 2, 1, then the while terminates
}
// n is 0
0赞 Ted Lyngmo 2/12/2022 #2

鉴于

int n, x;
递减后: 等同于:
n = 6; n = 6;
x = n--; x = n;
n = n - 1;

这导致 和 。x == 6n == 5


预递减: 等同于:
n = 6; n = 6;
x = --n; n = n - 1;
x = n;

这导致 和 再次 。x == 5n == 5


因此,递减前和递减后的共同点是 的值减少了 1,这就是为什么你看不到循环内部的原因。n6

如果要从 to(含)循环,使用 -loop 会更简单:61for

for(n = 6; n; --n) {
    printf("n = %d\n", n);
    ans *= n;
}

这类似于

n = 6;
while(n) {
    printf("n = %d\n", n);
    ans *= n;
    --n;
}
-1赞 onapte 2/12/2022 #3

答案就在于递减后运算符。每次遇到时,n 的值都会保持不变,并且与递减后运算符的预期不同。while (n--)nn-1--

while (n--) { // At first, n is 6 for this statement
    // n is 5 then 4, 3, 2, 1
}

同样,

for (int i = 0; i < n; i--) {
    // Some code
}

for (int i = 0; i < n; --i) {
    // Some code
}

具有相同的 i 值。

1赞 0___________ 2/12/2022 #4

while (n--)

  1. while检查是否为非零。(nn == 6)
  2. n正在减少。(n == 5)
  3. while 的正文被执行。(5 正在打印中)

要从多个,你需要使用循环6do ... while

int main(void)
{
    int ans = 1, n = 6;

    do
    {
        printf("n = %d\n", n);
        ans *= n ? n : 1;
    }while (n--);

    printf("ans = %d", ans);

    return 0;
}

    while(n)
    {
        printf("n = %d\n", n);
        ans *= n;  // note you do not need to check if n != 0
        n--;
    }