2

我对下面的代码有一些疑问

  #include<stdio.h>
   int i=6;
    int main()
     {
      int i=4;
      {
       extern int i;
       printf("%d",i); //prints 6
      }
      printf("%d",i); //prints 4
     }

我们知道extern关键字说编译器,变量在外面的某个地方。所以问题是为什么extern关键字访问的是全局i变量而不是i主函数中的变量?我在想一定存在矛盾,因为这两个变量都可以作为全局变量供内括号使用。extern 关键字访问函数外部的变量还是访问大括号外部的变量也是如此。

4

5 回答 5

5

extern并不意味着在当前范围之外,它意味着具有外部链接的对象。自动变量从不具有外部链接,因此您的声明extern int i不可能引用它。因此它隐藏了它,就像自动变量隐藏了全局一样。

于 2012-06-08T08:40:31.987 回答
3

printf打印 6 之前,您要求编译器i使用#include. 然后右大括号告诉编译器extern不再有效,因此它使用i设置为 4 的范围。

于 2012-06-08T07:48:21.297 回答
1

int i=4不是全局变量,如果您尝试访问另一个函数中 main 内部的var i ,您的编译器将抛出有关var i is undeclared的错误。这段代码说明了这一点。

void func() {
    printf("i is %d\n",i);
}

main() {
    int i=10;
    func();
}

而 main 之外的 i 是全局变量,您可以在所有函数中访问它。

于 2012-06-08T07:55:29.060 回答
1

/* Ed Heal 所说的 */ 然而,我认为最好用额外的例子来说明它。我修改了你的例子来做更多的事情。代码中的注释说明了大部分内容:

#include <stdio.h>
int i = 6;
int main(void)
{
    int i = 4;
    printf("%d\n", i); /* prints 4 */
    {
        extern int i; /* this i is now "current". */
        printf("%d\n", i); /* prints 6 */
        {
            int *x = &i; /* Save the address of the "old" i,
                          * before making a new one. */
            int i = 32; /* one more i. Becomes the "current" i.*/
            printf("%d\n", i); /* prints 32 */
            printf("%d\n", *x); /* prints 6 - "old" i through a pointer.*/
        }
        /* The "previous" i goes out of scope.
         * That extern one is "current" again. */
        printf("%d\n", i); /* prints 6 again */
    }
    /* That extern i goes out of scope.
     * The only remaining i is now "current". */
    printf("%d\n", i); /* prints 4 again */
    return 0;
}
于 2012-06-08T16:55:31.783 回答
1

我认为您是在问您是否正确地认为extern int i声明应该导致第一个printf解析i为,4因为该int i=4声明位于声明 extern 的范围的父范围内。

答案是否定的,因此您所看到的行为。函数内的extern声明用于声明外部变量的存在,并且永远不会解析为局部变量(在函数声明的变量)。

于 2012-06-08T08:20:17.510 回答