【问题标题】:Why is it possible to define a variable inside a loop in C?为什么可以在 C 中的循环内定义变量?
【发布时间】:2021-02-13 13:15:05
【问题描述】:

为什么这段代码没有给出重定义错误:

int main(void)
{
    for (int i = 0; i < 2; i++)
    {
        int number = 5;
    }
}

虽然这段代码是这样的:

int main(void)
{
    int number = 5;
    int number = 5;
}

【问题讨论】:

  • “为什么可以在 C 中的循环内定义变量?” - 因为这是一件非常实用的事情。
  • 有人问过这个关于 C++ 的问题。接受的答案有一个很好的功能说明,原理相同stackoverflow.com/q/66124034/817643

标签: c loops redefinition


【解决方案1】:

在第一个代码中,number 的范围在执行到达 for 循环开始时开始,并在执行到达 for 循环结束时结束。在这种情况下,for循环的主体被执行了两次,number被创建和销毁两次,并且有两个不相交的作用域。在第二个代码中,范围不是不相交的,因为之前的 number 在定义第二个代码时仍然保持其生命周期,并且它们在同一范围内,所以这是一个重新定义错误。

【讨论】:

  • 寿命实际上不是这里的问题;范围是。
  • 所以每次迭代都是不同的范围?我不确定,所以我不想这么说,而且在技术上听起来不正确,所以我使用了“lifetime”。
  • 范围与程序执行没有任何关系,包括循环的迭代。范围是在程序源代码中标识符可见的地方。生命周期是在程序执行期间对象存在。本质上,一个标识符不能在一个范围内引用两个不同的事物。允许内部范围内的声明隐藏外部范围内相同标识符的声明,但这在同一范围内不起作用。
  • 那么,我可以将for (int i = 0; i &lt; 2; i++) {int number = 5; printf("Hello World);}{int number = 5; printf("Hello World");} {int number = 5; printf("Hello World");} 视为同一件事吗?
  • @kooru_hi 是的,我认为你可以
【解决方案2】:

Redfinition 错误是编译时问题,而不是运行时问题。您不会在循环中收到重新定义错误,因为在该范围内您只有一个 number 声明。

在第二个 sn-p 中,您在同一范围内有两个 number 声明,因此出现错误。

【讨论】:

    【解决方案3】:

    基本上,在循环中创建变量将使变量的范围保持在这个循环中。 “数字”在您的循环之外不存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多