理解C语言中的for循环

3
我在理解以下这段简单的C语言for循环代码时遇到了一些困难。
int j=20;
for(int i=0, j; i<=j ; i++, j--)     
    printf("i = %d and j = %d \n",i,j);                     

将输出打印为

i=0 and j=2
i=1 and j=1

为什么它不以 j=20 开始,而是打印出 j=2 并在 j=1 后停止。

但是当我使用这段代码时

int j=20;
for(int i=0, j=20; i<=j ; i++, j--)     
    printf("i = %d and j = %d \n",i,j);   

它可以通过以下方式正确启动

i=0 and j=20 upto ... i=9 and j= 11

我有什么遗漏吗?

3
啊啊啊... 变量屏蔽... - Mysticial
更糟糕的是,阴影变量 j 没有初始化。 - chris
1
@AdrianCornish,嗯,我从未听说过可以在不提及2的情况下将int初始化为2的东西。 - chris
2
请注意,编译器可能会为此情况生成多个警告消息(例如“重复声明”或“未初始化变量”)。检查这些警告消息是明智的。 - Hot Licks
2
@A K - 我不知道这是否是有效的C代码。但如果是,请不要将其编写为无法阅读和理解的代码。如果您编写这样的代码,它将在以后的生活中给您带来麻烦。 - Ed Heal
显示剩余9条评论
4个回答

9
您好。在for循环中声明j会创建一个新的(有作用域的)j,其值与外部的j不同。如果您未对其进行初始化,则会得到分配内存时存在的任何垃圾值。
这样的变量称为“自动”变量,并分配在程序的堆栈上。当需要一个变量时,会分配更多的堆栈空间。当它们超出作用域时(实际上是函数返回时),它们通过弹出所有变量来进行清理。
当需要下一个自动存储位时,同样的事情会发生,并且您将获得剩余在堆栈上的任何位模式作为新变量的值。

1
当然,内部变量j有一个值,只是语言没有定义它将是什么。由于它是从堆栈中分配的,因此它将是“顶部”上的任何内容,这在程序运行时可能非常一致。 - Tony K.
@AdrianCornish -- 是的,所有变量都有值。但是,在这种情况下,变量j的“值”是由前一个方法调用在该位置留下的任何垃圾。 - Hot Licks

4
请注意,在for循环的第一部分中,您已经执行了int i = 0, j。这将声明一个名为j的变量,其作用域仅限于for循环。因此,在for循环之前声明和定义的j与在for循环作用域内声明和定义的j之间没有关系。在循环内引用j将引用最内部的块,因此,由于将j初始化为零,您会得到第一个输出。 此外,请注意,您很幸运j的值为零。它是自动变量,不能保证在定义时为零。 在下一次循环中,您将看到所需的输出,因为先前定义在for循环内的j被引用,但是由于您已将for循环局部定义的j的值初始化为与外部j相同的值(与for循环内的j无关),因此您会在问题中获得第二个输出。

0
这个问题是关于一行代码的。 当你在一行中输入 int i=0,j; 时,它等同于 int i = 0; int j; 然而,当你输入 int i=0, j=20; 时,除非先定义了 j,否则会出错,这不等同于 int i = 0; int j = 20;

0
基本上这是关于for循环语法的常见疑惑。在你的情况下发生的是:
int i=0, j; //create 2 int variables - i (which is initialized to 0) and uninitialized j

这看起来类似于 for(i,j; i<j; i++, j--)。然而你所做的事情 - 基本上是创建了一个额外的未初始化变量 j


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接