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=2j=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

有什么我想念的吗?

4

4 回答 4

9

你是。在 for 构造中声明 j 会创建一个新的(作用域的)j,它的值与外部不同。如果你没有初始化它,你会得到分配时内存中发生的任何垃圾。

像这样的变量称为“自动”变量,并分配在程序的堆栈上。当你需要一个时,会分配更多的堆栈空间。当它们超出范围时(实际上是函数返回时),它们会通过将它们全部弹出来进行清理。

当需要下一个自动存储位时,会发生同样的事情,然后您将获得堆栈中剩余的任何位模式作为您的新变量值。

于 2012-09-08T02:54:40.470 回答
4

请注意,在 for 循环的第一部分中您已经完成了int i = 0, j。这样做是声明一个名为的变量,该变量j具有for 循环的本地范围j因此,在 for 循环之前声明和定义的内容与您在 for 循环范围内声明和定义的内容之间没有关系。在循环内部引用将引用j最里面的块,因此将j初始化为零,您将获得第一个输出。

另请注意,您很幸运, 的值j为零。它是一个自动变量,不能保证在定义时为零。

在下一个循环中,您会看到所需的输出,因为如前所述,在 for 循环内部定义的内容被引用,但是由于您已将for 循环的 localj值初始化为与外部相同的值(这与for循环内部),因此您会在问题中获得第二个输出。jjj

于 2012-09-08T03:42:51.337 回答
0

这个问题是关于一行代码的。当你输入int i=0, j;一行时,它等于int i = 0; int j; 然而,当你输入时int i=0, j=20;,它会给你一个错误,除非 j 之前定义过,它不等于 int i = 0; int j = 20;

于 2012-09-08T04:25:14.003 回答
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

于 2012-09-08T03:02:40.277 回答