c中for循环的困惑:c语言中的自增逻辑
Confusion about for loop in c: increment logic in c language
我对C语言循环递增的基本概念感到困惑。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int j=0;int a;
for(j;j<=3;++j)
{
printf("hello\n");
a=j;
}
printf("%d,%d\n",j,a);
}
我的问题是:为什么a的输出不等于j的输出?我在想,如果 j
在每次迭代中都增加并且 j
的值存储在 a
中,那么为什么不一样?
直到 j<=3
条件 j
的值被分配给 a
但在那之后当 j
递增 1 (j==4) 时,它中断从循环中退出,因为 j
的值现在是 4
并且它没有将 j
的值分配给 a
。所以最后我们得到 a=4
和 j=3
.
对于j=0
a=0
对于j=1
a=1
对于j=2
a=2
对于j=3
a=3
对于j=4
循环终止,因为j<=3
变为假,所以j值为4,a值为3。
这是由于for循环中3个表达式的执行方式所致。
考虑
for( exp1; exp2; exp3)
{
body;
}
这将像这样执行:
exp1;
if (exp2 == false) goto end_of_loop;
body;
exp3;
if (exp2 == false) goto end_of_loop;
body;
exp3;
if (exp2 == false) goto end_of_loop;
body;
exp3;
if (exp2 == false) goto end_of_loop;
. . .
. . .
end_of_loop:
如您所见,exp3
总是在body
之后执行一次。
因此在您的情况下 j
将在分配给 a
后递增一次。
喜欢:
a=j; // part of body
++j; // exp3
j<=3 (exp2) becomes false and the loop ends
for
循环在每次迭代时检查条件。因此,当您初始化 j=0
时,给出以下代码循环到 j<=3
的条件,同时在每次迭代后递增 j
的值,循环执行相同的操作。
因此对于第一次迭代,j 为 0,因此条件满足,a
被赋值为 j
。现在 j
的值增加 1。一直持续到 j=3。
当j=3时,a也等于3。现在,j的值增加1,等于4。现在检查条件。自 j!=3
起,循环中断,您移出循环。因此,虽然j=4,a还是3。
希望对您有所帮助。
第一名:
j = 0
j <= 3 => print hello and a = 0, ++j
第二名:
j = 1
j <= 3 => print hello and a = 1, ++j
第三名:
j = 2
j <= 3 => print hello and a = 2, ++j
第四名:
j = 3
j <= 3 => print hello and a = 3, ++j
第五名:
j = 4 not satisfy j <= 3
所以 j = 4 和 a =3
当我们在循环概念中使用前缀递增时,我们应该小心一点。
For j=0 a=0
# 第一次迭代
For j=1 a=1
#第二次迭代
For j=2 a=2
# 第三次迭代
For j=3 a=3
#第4次迭代
For j=4
因为条件不满足,控制从for循环中出来。但是 j
值较早递增,因此它输出 "4"
.
我对C语言循环递增的基本概念感到困惑。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int j=0;int a;
for(j;j<=3;++j)
{
printf("hello\n");
a=j;
}
printf("%d,%d\n",j,a);
}
我的问题是:为什么a的输出不等于j的输出?我在想,如果 j
在每次迭代中都增加并且 j
的值存储在 a
中,那么为什么不一样?
直到 j<=3
条件 j
的值被分配给 a
但在那之后当 j
递增 1 (j==4) 时,它中断从循环中退出,因为 j
的值现在是 4
并且它没有将 j
的值分配给 a
。所以最后我们得到 a=4
和 j=3
.
对于j=0
a=0
对于j=1
a=1
对于j=2
a=2
对于j=3
a=3
对于j=4
循环终止,因为j<=3
变为假,所以j值为4,a值为3。
这是由于for循环中3个表达式的执行方式所致。
考虑
for( exp1; exp2; exp3)
{
body;
}
这将像这样执行:
exp1;
if (exp2 == false) goto end_of_loop;
body;
exp3;
if (exp2 == false) goto end_of_loop;
body;
exp3;
if (exp2 == false) goto end_of_loop;
body;
exp3;
if (exp2 == false) goto end_of_loop;
. . .
. . .
end_of_loop:
如您所见,exp3
总是在body
之后执行一次。
因此在您的情况下 j
将在分配给 a
后递增一次。
喜欢:
a=j; // part of body
++j; // exp3
j<=3 (exp2) becomes false and the loop ends
for
循环在每次迭代时检查条件。因此,当您初始化 j=0
时,给出以下代码循环到 j<=3
的条件,同时在每次迭代后递增 j
的值,循环执行相同的操作。
因此对于第一次迭代,j 为 0,因此条件满足,a
被赋值为 j
。现在 j
的值增加 1。一直持续到 j=3。
当j=3时,a也等于3。现在,j的值增加1,等于4。现在检查条件。自 j!=3
起,循环中断,您移出循环。因此,虽然j=4,a还是3。
希望对您有所帮助。
第一名:
j = 0
j <= 3 => print hello and a = 0, ++j
第二名:
j = 1
j <= 3 => print hello and a = 1, ++j
第三名:
j = 2
j <= 3 => print hello and a = 2, ++j
第四名:
j = 3
j <= 3 => print hello and a = 3, ++j
第五名:
j = 4 not satisfy j <= 3
所以 j = 4 和 a =3
当我们在循环概念中使用前缀递增时,我们应该小心一点。
For j=0 a=0
# 第一次迭代
For j=1 a=1
#第二次迭代
For j=2 a=2
# 第三次迭代
For j=3 a=3
#第4次迭代
For j=4
因为条件不满足,控制从for循环中出来。但是 j
值较早递增,因此它输出 "4"
.