【问题标题】:Variable redeclaration in c in loop and outside loop?循环中和循环外的c中的变量重新声明?
【发布时间】:2016-02-23 20:44:46
【问题描述】:

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

【问题讨论】:

  • for 循环正确运行两次
  • 第二个代码不是C。它不编译。然而,令人惊讶的是,它是有效的 C++。

标签: c variables for-loop redeclaration


【解决方案1】:

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

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


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

C11 标准规定,§6.2.1.4:

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

【讨论】:

    【解决方案2】:

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

    #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 声明了 3 次。

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

    0
    1
    2
    

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

    -1

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

    200

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 你不能有 2 个同名的变量(这就是错误发生在第一个代码中的方式)。第二个代码很好,因为你没有声明 2 个同名的变量(你已经声明了 int j 作为第一个变量,int i 作为第二个变量)。这就是我能对你说的。清除吗?
      猜你喜欢
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 2018-05-13
      • 2018-10-11
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      相关资源
      最近更新 更多