C中的范围规则-IDC帮帮忙

标识符的范围是程序中可直接访问标识符的部分。在C中,所有标识符都 词法(或静态)范围, C范围规则可以包含在以下两个类别中。

全局范围:可以在程序中的任何位置访问。

// filename: file1.c
int a;
int main(void)
{
   a = 2;
}
// filename: file2.c
// When this file is linked with file1.c, functions of this file can access a
extern int a;
int myfun()
{
   a = 2;
}

要仅限制对当前文件的访问,可以将全局变量标记为静态。

块范围:块是一组括在左右括号内的语句(分别为{和})。块可以嵌套在C中(块可以包含其中的其他块)。块中声明的变量可以在块中以及该块的所有内部块中访问,但不能在块外部访问。

如果内部块本身有一个具有相同名称的变量,该怎么办?
如果内部块声明了一个与外部块声明的变量同名的变量,那么外部块变量的可见性在内部块的声明点处结束。

int main()
{
  {
      int x = 10, y  = 20;
      {
          // The outer block contains declaration of x and y, so 
          // following statement is valid and prints 10 and 20
          printf("x = %d, y = %d\n", x, y);
          {
              // y is declared again, so outer block y is not accessible 
              // in this block
              int y = 40;
   
              x++;  // Changes the outer block variable x to 11
              y++;  // Changes this block's variable y to 41
     
              printf("x = %d, y = %d\n", x, y);
          }

          // This statement accesses only outer block's variables
          printf("x = %d, y = %d\n", x, y);
      }
  }
  return 0;
}

输出:

x = 10,y = 20
x = 11,y = 41
x = 11,y = 20

那些传递给函数的函数和参数呢?
函数本身就是一个块。函数的参数和其他局部变量遵循相同的块范围规则。

可以在另一个后续块中访问块
的变量吗?*否,块中声明的变量只能在块的块内以及该块的所有内部块中访问。例如,以下程序产生编译器错误。

int main()
{
  {
      int x = 10;
  }
  {
      printf("%d", x);  // Error: x is not accessible here
  }
  return 0;
}

输出:

错误:'x'未声明(首次使用此功能)

作为练习,预测以下程序的输出。

int main()
{
  int x = 1, y = 2, z = 3;
  printf(" x = %d, y = %d, z = %d \n", x, y, z);
  {
       int x = 10;
       float y = 20;
       printf(" x = %d, y = %f, z = %d \n", x, y, z);
       {
             int z = 100;
             printf(" x = %d, y = %f, z = %d \n", x, y, z);
       }
  }
  return 0;
}