C中的变量声明是否仅限于外部关键字与定义

时间:2018-10-24 12:29:09

标签: c

我怀疑在寻找“声明”和“定义”之间的区别时我缺少什么,我找到了链接 https://www.geeksforgeeks.org/commonly-asked-c-programming-interview-questions-set-1/ 它在这里说

// This is only declaration. y is not allocated memory by this statement 
  extern int y; 

  // This is both declaration and definition, memory to x is allocated by this statement.
  int x;

现在,如果我看下面的代码

int main() 
{ 
{ 
    int x = 10;
    int 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 y = 40 修改为 y = 40 然后代码看起来像

// int y;

int main() 
{ 
{ 
    int x = 10;
    int 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 
            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 = 41

我的朋友告诉我这是因为我们在第一个代码中声明了一个新的 y ,它位于块的本地,而在第二种情况下则不是,我不知道为什么只是第二次在变量前面写数据类型,这是否意味着通过写数据类型我们保留了一个新的内存空间并创建了一个新变量,请解释。

如果我在链接上阅读有关Stackoverflow的另一篇文章 What is the difference between a definition and a declaration?

我看到,每当我们说要声明一个变量时,该变量都以extern关键字开头,并且我所说的语言与C紧密相关,而与任何其他语言均无关。

所以我们可以推广到extern关键字前面的变量声明。

我了解我的英语可能对您不利且难以理解,请多多包涵。

2 个答案:

答案 0 :(得分:2)

    { 
        // y is declared again, so outer block y is not accessible 
        // in this block 
        y = 40; 

您的评论是错误的。这不是声明 y。只是分配给它。

它应该说:

// This changes the value of y in the outer block
  

这是否意味着通过写入数据类型,我们保留了一个新的内存空间并创建了一个新变量

是的

  • int y是一个新变量的声明。
  • int y = 40是声明初始化。
  • y = 40是对现有变量的赋值。

答案 1 :(得分:1)

extern int y;告诉编译器,y可以在链接到该程序的另一个文件中声明,例如库,头文件等,并且如果编译器找到了称为y,则应使用其内存地址作为此文件中声明的y的地址。即:

//Look for a global variable called "y" in the included files
//If it is found, use its memory address
extern int y;

现在,为您的第一个代码示例...

首先,您声明并实例化两个变量xy

int x = 10;
int y = 20;

然后打印它们,导致打印x = 10, y = 20。这是有道理的,因为x是10,而y是20。

然后,使用大括号创建一个新范围,并声明一个名为y的新变量。由于此变量与变量名相同,因此在其作用域之后,它会隐藏名为 y的外部变量,直到退出该作用域为止。

{
    int y = 40;

this y的任何更改都不会影响外部y,并且只有在 this < / em> y已退出。

然后,您递增yx,然后打印结果。由于上述行为,将打印y

打印上面的字符串后,代码退出当前作用域。因此,外部x = 11, y = 41不再被隐藏,现在可以对其进行访问。

最后,您再次打印yxy为11,因为它较早地增加了,但是外面的x 没有增加,因此打印了y


像在第二个代码示例中一样,用x = 11, y = 20替换int y = 40会导致仅声明和实例化一个y = 40变量。因此,y在第三条y语句中最终为41。