c中循环和外部循环中的变量重新声明?

Variable redeclaration in c in loop and outside loop?

int i; 语句在程序中声明 2 次时它会显示错误,但是当 int i; 写在运行两次的 for 循环中时,它不会显示任何错误。

#include<stdio.h>//code 1 showing error
int main()
{
    int i;
    int i;
    return 0;
}
#include<stdio.h>//code 2 no error
int main()
{
    for(int j=1;j<=2;j++)
        int i;
    return 0;
}

这是因为声明变量的作用域只在你声明她的代码块内。在那个街区外面是看不到的。

我已经看到你的代码 now.It 很清楚,在 1. 代码中你声明了两个具有相同名称的整数,这是不允许的,在 2. 代码中你声明了两个具有不同名称的 int 所以它是不错。

为了理解您的问题,也称为变量的作用域,让我们看下面的示例程序:

#include <stdio.h> 

int main(int argc, char *argv[])
{
    int I = -1;
    for (int I = 0; I < 3; I++) {
        printf("%d\n", I);
    }
    printf("%d\n", I);
    {
        int I = 200;
        printf("%d\n", I);
    }
    return 0;
}

如您所见,我将变量 I 声明了三次。

当在循环中声明时,结果将打印以下值:

0
1
2

在 for 循环之后,当我再次打印 I 变量时,我指的是在 for 循环外声明的变量,我声明的第一个变量,因此结果将是:

-1

现在,如果我用花括号打开一个新范围,并声明一个具有相同名称但具有不同值的新变量,我将得到:

200

我希望我对变量范围的描述现在清楚了

第一个 main 尝试定义两个具有相同标识符的变量。这显然是被禁止的,会导致编译错误。

第二个 main 包含一个 for 循环。 for 循环 引入了一个新的作用域 ,如果没有添加花括号,它只包含下一个语句或定义(即 int i;)。
i 分配 释放 每次迭代 ,所以它真的一次只存在一次。曾经定义的所有 i 都在 不同的范围 中。因此没有命名冲突。


如果您在外部作用域中有一个变量(即main的函数作用域)并且在内部作用域[=41=中有一个变量](即 for-循环的范围),来自内部范围的变量 隐藏 来自外部范围的变量,从而使外部范围变量不可访问。

C11 标准说,§6.2.1.4:

Within the inner scope, the identifier designates the entity declared in the inner scope; the entity declared in the outer scope is hidden (and not visible) within the inner scope.