2017-05-31 6 views
2

以下のプログラムをご覧ください。私は次のコンパイラの警告を受け取ります。「int i = 10;」を実行します。 「int i; i = 10;」私がグローバル変数であるときに異なる関数を実行しますか?

のbash-3.2 $のgcc -Wall Test1.cに Test1.cに:6:警告:6:警告: 'は宣言の中で 'INT' にタイプのデフォルトデータ定義は何種類かのストレージクラス Test1.cにしていませんj '

通常、この警告は、ランタイム操作が関数の外部に書き込まれたときにスローされます。ですから、私はなぜグローバルなスコープで "int j; j = 20"が警告をスローしますが、 "int i = 10"はスローされないのか疑問に思っていますか?

#include <stdio.h> 

    int i = 10; 

    int j; 
    j=20; 

    int 
    main(void) 
    { 
     int k; 

     k = 30; 

     printf("%d %d %d\n", i, j, k); 

     return 0; 
    } 
+0

警告が最後まで読みましたか? – DeiDei

+0

@DeiDei:私は今それを見る。 "警告:型の既定値は 'j'の宣言で 'int'"は実際にj = 20が宣言であることを伝えています。ありがとう。 – NeilB

答えて

7

このライン

j=20; 

は割り当てません。暗黙のタイプintを使用するのは、jの宣言です。

Cは限りが一致するように、あなたがグローバルスコープで同じ変数の複数の宣言を作成してみましょう:

int j; 
int j; 
int j = 20; 

プリC99 C規格はまた、任意の型を指定しないintのタイプを想定します。ここで

はあなたの例を破ることができる方法です。

double j; 
j = 20; 

jdoubleとして宣言し、その後intとして再宣言されているので、これは、コンパイルされません。

+2

暗黙のintはC89でのみ有効であり、C99以降では無効であることに注意してください。 – DeiDei

+0

@DeiDeiあなたはそうです、私はこの習慣がしばらく禁止されていることを言及する必要があります。 – dasblinkenlight

+2

暫定的な定義はC99とC11でも有効です。 C99で「動作を停止しました」という暗黙のintだけです –

0

int i; 暫定的な定義です。 次の定義はI = 10です。それを宣言に変換します。

関連する問題