【问题标题】:Variable Scope in C programmingC 编程中的变量作用域
【发布时间】:2014-01-15 22:27:20
【问题描述】:

在 c 中,当这段代码运行时,它输出 10 10 10 10 10。我认为循环应该在第一次执行后退出,因为 i 变为 11,但它没有发生。为什么会这样?

#include<stdio.h>
int main()
{
  int i; 
  for(i=0;i<5;i++)
  {
     int i=10;  
     printf("%d\t",i);
     i++;
  }
  return;
}

但是当程序编写如下时,输出与我的想法相似(即 10 )。上面的代码和下面显示的代码之间的确切区别是什么? C如何处理这些变量?如果有人对此进行解释,我会很高兴。

#include<stdio.h>
int main()
{
  int i; 
  for(i=0;i<5;i++)
  {
     i=10;  
     printf("%d\t",i);
     i++;
  }
  return;
}

【问题讨论】:

  • 你不应该从main() 执行return;——它应该有一个返回值,编译器应该会抱怨。
  • 应该是return 0
  • ya..true..谢谢指出..

标签: c scope


【解决方案1】:

在 C99 或更高版本中,您可以使用 3 个名为 i 的独立变量在代码上编写此变体:

#include <stdio.h>
int main(void)
{
    int i = 19;
    printf("i0 = %d\n", i);
    for (int i = 0; i < 5; i++)
    {
        printf("i1 = %d\n", i);
        int i = 10;
        printf("i2 = %d\n", i);
        i++;
    }
    printf("i0 = %d\n", i);
    return 0;
}

输出是:

i0 = 19
i1 = 0
i2 = 10
i1 = 1
i2 = 10
i1 = 2
i2 = 10
i1 = 3
i2 = 10
i1 = 4
i2 = 10
i0 = 19

(在 C89 中,您不能在输出中将变量标记为 i1,并且您无法在循环中演示这两个变量,因为声明必须在诸如 printf() 调用之类的语句之前。)

【讨论】:

    【解决方案2】:

    在第一个代码中,您两次声明变量:一个在循环外,第二个在循环内。所以在循环编译器内部找到了另一个变量声明,所以它使用内部声明(这称为block scope)。

    所以第一个程序打印10 10 10 10 10,因为这是内部声明int i=10

    但是在第二个代码中你声明了一次,所以编译器在整个程序中使用这个声明。

    【讨论】:

      【解决方案3】:

      在您的第一个程序中,for 循环使用在for 外部声明的i 来控制循环。 printf 使用在 for 循环内声明的 i 来打印值,并且此 i 具有块范围。

      loopi 的新声明暂时隐藏了旧声明。现在i 的值是10。在for 循环块结束时,新的i 对程序不可见,变量恢复其旧含义,这次i 根据循环的迭代存储值(1,@ 987654336@、34)。

      【讨论】:

      • ...as for()、while() 和大多数控制结构,除了 switch ... case(使用标签而不是块)在 C 中是单独的范围,条件/控制块是外部和内部范围之间的 extra 范围。因此控制块中定义的变量在控制块结构体中都是有效的。
      • @dom0:说得有点迂腐,“内部范围”并不是控制结构的特殊部分。控制结构接受一个语句,在这种情况下它恰好是一个块语句。块语句创建一个新范围。这与例如没有什么不同。 int main(void) { int i; { int i; ... } }.
      • 因此,for 循环中的新声明隐藏了 i 的先前声明,当控制到达 for 循环的更新部分时,声明了 i循环内部是隐藏的。? @hacks
      • @Kindle;是的。没错。
      【解决方案4】:

      因为在第一个示例中,循环内的i 与控制/控制循环的不同,它是一个完全不同的变量,尽管名称相同。

      【讨论】:

        猜你喜欢
        • 2010-12-12
        • 1970-01-01
        • 1970-01-01
        • 2012-05-02
        • 1970-01-01
        • 1970-01-01
        • 2018-01-20
        • 2011-01-11
        • 1970-01-01
        相关资源
        最近更新 更多