我正在解决一些考试问题,我遇到了这个问题,但我就是不明白。
int main()
{
int a[3+2] = {1, 2, 3}, i;
for(i = 0; a[i++]++;)
printf("%d", a[i]);
return 0;
}
为什么这段代码的输出是 2 3 0?我尝试了几种思维方式,但无法理解。
答案 0 :(得分:2)
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 的测试中使用这些值之前 incr
注意在 pre incr (++a[++i]
) 的情况下结果未定义,因为两个 incr 的顺序未指定
答案 1 :(得分:2)
在第一次迭代中,a[i++]++
会做两件事:
i
的值并将其递增(第一个 ++
),因此我们现在剩下 a[0]
(i
初始化为 0),a[0]
,它再次进行后递增(第二个 ++
),因此最终返回 a[0]
,然后递增它。因此对于第一次迭代,for
的条件中返回的值是 a[0]
,即 1,因此循环将继续执行其主体。
来到我们的 for 循环的主体,我们现在对上面的语句有两个变化,i
和 a[i]
都增加了,所以我们有 i = 1
和 a[0] = 2
(a[0]
增加了 1,记住外面的 ++
)。
以同样的方式继续,我们将继续到 i = 2, a[1] = 3
(a[1]
是 2 但后递增,所以变成 3)。
此后,再次回到循环的条件,我们有 i
(=2) 和 a[i]
(=3) 都再次后递增,因此返回的值将是 {{1 }} 即 a[i]
(因为 a[2]
现在是 2,现在它在返回后递增),所以 i
在 for 循环体内的下一条语句中将是 3,即将使数组元素为 i
,即为 0(这就是您在最后一次迭代中得到 a[3]
的原因)。
由于 0
和数组声明,我们将 i = 3
的默认值设为 0,它在下一次迭代中给出 a[3]
, i = 3
。
再次回到有条件的循环,它将返回 a[i] = a[3] = 0
,此时 a[i]
为 0,因此条件失败并因此停止循环。因此,之后您无需打印任何内容。
答案 2 :(得分:1)
它是这样发生的,因为在 for 中你有一个 [i++]。当 i = 3 数组中的计数为 4 并且您收到 int 的默认值,即 0,您的数组为 [1, 2, 3, 0, 0 ]。对不起,我的英语不好。
答案 3 :(得分:1)
这个
if (doc.exists) {
this.$set(this.products, doc.id, {
data: doc
});
}
与
相同int a[3+2] = {1, 2, 3}
你的循环:
int a[5] = {1, 2, 3, 0, 0}
在 a[i] == 0 时立即停止打印,在您的情况下是在第 4 个位置。你的循环相当于
for(i = 0; a[i++]++;)