我很难在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
我有什么遗失的东西吗?
答案 0 :(得分:9)
你是。在for构造中声明j会创建一个新的(作用域)j,其值与外部不同。如果你没有初始化它,你会得到分配时发生在内存中的任何垃圾。
这样的变量称为“自动”变量,并在程序的堆栈上分配。如果需要,可以分配更多的堆栈空间。当它们超出范围时(实际上当函数返回时),通过将它们全部弹回来清除它们。
当需要下一位自动存储时,会发生同样的事情,然后你可以获得在堆栈上留下的任何位模式作为新的变量值。
答案 1 :(得分:4)
请注意,在for循环的第一部分中,您已完成int i = 0, j
。这样做是为了声明一个名为j
的变量,它具有for循环的范围。因此,在for循环之前声明和定义的j
与在for循环范围内声明和定义的j
之间没有任何关系。在循环内引用j
将引用最里面的块,因此将j
初始化为零,您将获得第一个输出。
另请注意,您很幸运,j
的值为零。它是一个自动变量,在定义时不保证为零。
在下一个循环中,您会看到所需的输出,因为之前在for循环中定义的j
被引用,但是因为您已初始化for循环的j
本地值外部j
的相同值(与for循环中的{{1}}无关),因此您在问题中得到第二个输出。
答案 2 :(得分: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
。
答案 3 :(得分:0)
这个问题是关于单行代码的。
当您在一行中输入int i=0, j;
时,它等于int i = 0; int j;
但是,当您键入int i=0, j=20;
时,除非j之前已定义,否则它会给您一个错误,它不等于int i = 0; int j = 20;