为什么输出为 8883。代码是如何执行的?

Why is the output coming as 8883. How is the code is being executed?

变量 i 在循环的第一个条目处变为 8。那下次条件i <= 2怎么满足呢?

#include <stdio.h>

int main() 
{
    int i;
    for (i = 0; i <= 2; i++) 
   {
        int i = 8;
        printf("%d", i);
    }
    printf("%d", i);
    return 0;
}

它在 i = 0、i = 1 和 i = 2 的循环中打印 8 三次。

for(i=0;i<=2;i++)
{
   int i=8;
   printf("%d",i);
}

第二个变量i(在循环体内声明的)不会影响第一个i(在循环外声明的),因为它在不同的地方声明范围,即在循环内。

最后的最后 3 个来自因为最里面的 i 将在退出循环之前最后一次递增。所以对于:

printf("%d",i);

变量 i 将取值 3。

int i=8 是一个新变量的声明(声​​明并初始化新变量),它在局部范围内,从更一般的范围中隐藏现有变量。

换句话说:

  1. int i定义变量;
  2. for 使用该变量并用 0 初始化它并开始一个循环;
  3. int i=8 - 因为它是用 int 编写的 - 定义了新的局部变量,因为它与外部范围的 i 具有相同的名称 - 隐藏它(“隐藏”是一个条款)。因此循环中的更多代码使用新的本地 i 设置为 8.
  4. 内部 printf("%d",i); 打印 8.
  5. 循环结束,局部范围被擦除,因此内部 i=8 也被擦除。
  6. for 位于循环范围之外(在更一般的范围内)。 for 条件使用外部变量,在步骤 #2 中设置为 i=0。因此 for 在第二个循环中指示递增 (i++) 它,因此 i=1 通过了 i <= 2 检查。所以for确实开始执行下一个内部代码循环。
  7. 内部 for 循环外部 i 被内部 int i=8 遮蔽...(步骤 #3)。

简而言之:这是因为代码用int i声明了一个新变量。

好的作风是: for(int i=0;i<=2;i++) - 始终在一条指令中声明和初始化变量。

您在循环体内修改的变量 ifor 循环之前定义并在循环测试中使用的 i 不同。

int i 定义了一个只能在循环体内访问的新变量,它是一个有自己作用域的块。

因此代码打印 8 3 次,每次循环迭代一次,3 是循环后主体的变量 i 的值。

这是一个修改后的版本,它将按预期打印 89

#include <stdio.h>

int main() {
    int i;
    for (i = 0; i <= 2; i++) {
        i = 8;
        printf("%d", i);
    }
    printf("%d", i);
    return 0;
}

它将i设置为8并在循环体内打印8用于第一次迭代,然后i递增,9更大比 2 所以循环退出并且 9 由最后的 printf.

打印