理解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;