理解C中的循环
我很难在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
有什么东西我不见了吗?
你是。 在for构造中声明j会创建一个新的(作用域)j,其值与外部不同。 如果你没有初始化它,你会得到分配时在内存中发生的任何垃圾。
像这样的变量称为“自动”变量,并在程序的堆栈上分配。 当您需要时,会分配更多的堆栈空间。 当它们超出范围时(实际上当函数返回时),通过将它们全部弹回来清除它们。
当需要下一位自动存储时,会发生同样的事情,然后您可以获得在堆栈中留下的任何位模式作为新变量值。
请注意,在for循环的第一部分中,您完成了int i = 0, j
。 这样做是为了声明一个名为j
的变量,它具有for循环的局部作用域 。 因此,在for循环之前声明和定义的j
与在for循环范围内声明和定义的j
之间没有关系。 在循环内部引用j
将引用最内部的块,因此将j
初始化为零,即可获得第一个输出。
另请注意,您很幸运, j
的值为零。 它是一个自动变量,在定义时不保证为零。
在下一个循环中,你会看到你想要的输出,因为之前在for循环中定义的j
是被引用的,但是你已经将j
local的值初始化为for循环,并且j
外部值相同(没有任何内容)与for循环中的j
一起使用),因此你得到了问题中的第二个输出。
基本上这是for
循环语法中常见的混淆。 您的案例中发生的事情是:
int i=0, j; //create 2 int variables - i (which is initialized to 0) and uninitialized j
这类似于for(i,j; i
j
。
这个问题是关于单行代码的。 当你输入int i=0, j;
在一行中,它等于int i = 0; int j;
int i = 0; int j;
但是,当你输入int i=0, j=20;
,它会给你一个错误,除非j之前定义过,它不等于int i = 0; int j = 20;
int i = 0; int j = 20;