提问人:Yogi Patel 提问时间:2/12/2022 更新时间:2/13/2022 访问量:68
为什么在第一次迭代中 n 的值等于 5?
Why is the value of n equal to 5 in the first iteration?
问:
我有一个问题,为什么在第一次迭代中使用的 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
答:
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 == 6
n == 5
预递减: | 等同于: |
---|---|
n = 6; |
n = 6; |
x = --n; |
n = n - 1; |
x = n; |
这导致 和 再次 。x == 5
n == 5
因此,递减前和递减后的共同点是 的值减少了 1,这就是为什么你看不到循环内部的原因。n
6
如果要从 to(含)循环,使用 -loop 会更简单:6
1
for
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--)
n
n-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--)
while
检查是否为非零。(n
n == 6
)n
正在减少。(n == 5
)- while 的正文被执行。(5 正在打印中)
要从多个,你需要使用循环6
do ... 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--;
}
下一个:带有 if 条件的意外输出
评论
n--
将值从 6 递减到 5。在打印 so 之前运行。printf
5
n
while