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

それが6を出力する前にprintf、コンパイラに。のi後に定義されたものを使用するように要求してい#includeます。次に、閉じ中括弧は、externが有効でなくなったことをコンパイラに通知します。したがって、スコープiは4に設定されている場所を使用します。

于 2012-06-08T07:48:21.297 に答える
1

int i = 4はグローバル変数ではありません。別の関数でmain内にあるvariにアクセスしようとすると、コンパイラはvariが宣言されていないというエラーをスローします。このコードはそれを示しています。

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

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

mainの外側のiはグローバル変数であるのに対し、すべての関数でアクセスできます。

于 2012-06-08T07:55:29.060 に答える
1

そのステートメントはexternが宣言されているスコープの親スコープにあるため、extern int i宣言によって最初のprintf解決iが必要であると考えるのが正しいかどうかを尋ねていると思います。4int i=4

答えはノーです。したがって、あなたが見ている行動です。extern関数内の宣言は、外部変数の存在を宣言するために使用され、ローカル変数(関数内で宣言された変数)に解決されることはありません。

于 2012-06-08T08:20:17.510 に答える
1

/ * EdHealが言ったこと*/それでも、追加の例で説明するのが最善だと思います。私はあなたの例をもう少しするように修正しました。コード内のコメントは、そのほとんどを示しています。

#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 に答える