为什么输出2 3 0?
why is output 2 3 0?
我正在做一些考试题,我遇到了这个,但我就是不明白。
int main()
{
int a[3+2] = {1, 2, 3}, i;
for(i = 0; a[i++]++;)
printf("%d", a[i]);
return 0;
}
为什么这段代码的输出是2 3 0?我尝试了几种思考方式,但无法理解。
int a[3+2] = {1, 2, 3}, i;
for(i = 0; a[i++]++;)
printf("%d", a[i]);
相当于让阅读更简单
int a[3+2] = {1, 2, 3, 0, 0}, i;
for(i = 0; a[i];) {
a[i] += 1;
i += 1;
printf("%d", a[i]);
}
a[i] += 1;
所有++
都是postr incr,所以在for
的测试中使用before incr的值
请注意,pre incr (++a[++i]
) 的结果是未定义的,因为两个 incr 的顺序未指定
碰巧是这样,因为在for中你有一个[i++]。当 i = 3 数组中的计数为 4 并且您收到 int 的默认值,即 0,您的数组为 [1, 2 , 3, 0, 0]。抱歉我的英语不好。
在第一次迭代中,a[i++]++
将做两件事:
- Return
i
的值并增加它(第一个 ++
),这样我们就可以得到 a[0]
(i
初始化为 0)现在,
- 现在来到
a[0]
,它再次增加 post(第二个 ++
),所以这最终 returns a[0]
然后增加它。
所以对于第一次迭代,在for
条件中编辑的值return是a[0]
,即1,因此循环将继续到它的主体。
来到 for 循环的主体,我们现在对上面的语句有两个更改,i
和 a[i]
都递增,所以我们有 i = 1
和 a[0] = 2
(a[0]
加了 1,记住外面的 ++
)。
以同样的方式继续,我们将继续 i = 2, a[1] = 3
(a[1]
是 2 但 post 增加了,所以变成了 3)。
在此之后,再次回到循环的条件,我们有 i
(=2) 和 a[i]
(=3) 都再次 post-递增,所以值returned 将是 a[i]
即 a[2]
(因为 i
现在是 2,现在它在被 returned 之后递增),所以 i
在 for 循环体内的下一条语句中将是 3,这将使数组元素成为 a[3]
即 0(这就是为什么你在最后一次迭代中得到 0
)。
由于i = 3
和数组声明,我们将a[3]
的默认值设置为0,它在下一次迭代中给出i = 3
、a[i] = a[3] = 0
。
再次回到循环条件,它将 return a[i]
此时是 a[3]
即 0,因此条件失败并因此停止循环。因此,您之后不会打印任何内容。
这个
int a[3+2] = {1, 2, 3}
与
相同
int a[5] = {1, 2, 3, 0, 0}
你的循环:
for(i = 0; a[i++]++;)
一旦 a[i] == 0 就停止打印,在您的情况下是第 4 个位置。你的循环相当于
int a[3+2] = {1, 2, 3, 0, 0}, i;
for(i = 0; a[i] != 0;)
{
a[i]++;
i++;
printf("%d", a[i]);
}
a[i]++;
i++;
我正在做一些考试题,我遇到了这个,但我就是不明白。
int main()
{
int a[3+2] = {1, 2, 3}, i;
for(i = 0; a[i++]++;)
printf("%d", a[i]);
return 0;
}
为什么这段代码的输出是2 3 0?我尝试了几种思考方式,但无法理解。
int a[3+2] = {1, 2, 3}, i;
for(i = 0; a[i++]++;)
printf("%d", a[i]);
相当于让阅读更简单
int a[3+2] = {1, 2, 3, 0, 0}, i;
for(i = 0; a[i];) {
a[i] += 1;
i += 1;
printf("%d", a[i]);
}
a[i] += 1;
所有++
都是postr incr,所以在for
请注意,pre incr (++a[++i]
) 的结果是未定义的,因为两个 incr 的顺序未指定
碰巧是这样,因为在for中你有一个[i++]。当 i = 3 数组中的计数为 4 并且您收到 int 的默认值,即 0,您的数组为 [1, 2 , 3, 0, 0]。抱歉我的英语不好。
在第一次迭代中,a[i++]++
将做两件事:
- Return
i
的值并增加它(第一个++
),这样我们就可以得到a[0]
(i
初始化为 0)现在, - 现在来到
a[0]
,它再次增加 post(第二个++
),所以这最终 returnsa[0]
然后增加它。
所以对于第一次迭代,在for
条件中编辑的值return是a[0]
,即1,因此循环将继续到它的主体。
来到 for 循环的主体,我们现在对上面的语句有两个更改,i
和 a[i]
都递增,所以我们有 i = 1
和 a[0] = 2
(a[0]
加了 1,记住外面的 ++
)。
以同样的方式继续,我们将继续 i = 2, a[1] = 3
(a[1]
是 2 但 post 增加了,所以变成了 3)。
在此之后,再次回到循环的条件,我们有 i
(=2) 和 a[i]
(=3) 都再次 post-递增,所以值returned 将是 a[i]
即 a[2]
(因为 i
现在是 2,现在它在被 returned 之后递增),所以 i
在 for 循环体内的下一条语句中将是 3,这将使数组元素成为 a[3]
即 0(这就是为什么你在最后一次迭代中得到 0
)。
由于i = 3
和数组声明,我们将a[3]
的默认值设置为0,它在下一次迭代中给出i = 3
、a[i] = a[3] = 0
。
再次回到循环条件,它将 return a[i]
此时是 a[3]
即 0,因此条件失败并因此停止循环。因此,您之后不会打印任何内容。
这个
int a[3+2] = {1, 2, 3}
与
相同int a[5] = {1, 2, 3, 0, 0}
你的循环:
for(i = 0; a[i++]++;)
一旦 a[i] == 0 就停止打印,在您的情况下是第 4 个位置。你的循环相当于
int a[3+2] = {1, 2, 3, 0, 0}, i;
for(i = 0; a[i] != 0;)
{
a[i]++;
i++;
printf("%d", a[i]);
}
a[i]++;
i++;