-5

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;
}
4

3 回答 3

0

这是因为声明变量的范围仅在您声明她的代码块内。在那个街区外面看不到它。

我现在已经看到你的代码了。很明显,在 1. 代码中,你声明了两个具有相同名称的 int,这是不允许的,在 2. 代码中,你声明了两个具有不同名称的 int,所以这很好。

于 2015-11-21T10:43:25.763 回答
0

为了理解您的问题,也称为变量的范围,让我们看看以下示例程序:

#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 循环之外声明的变量,第一个 I 声明,因此结果将是:

-1

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

200

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

于 2015-11-21T10:51:36.403 回答
-1

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

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


如果你有一个外部范围的变量(即 的函数范围main)和一个内部范围的变量(即for-loop 的范围),则内部范围的变量隐藏外部范围的变量,从而呈现外部范围范围变量不可访问。

C11 标准说,§6.2.1.4:

在内部范围内,标识符指定在内部范围内声明的实体;在外部范围内声明的实体在内部范围内隐藏(不可见)

于 2015-11-21T10:53:51.013 回答