30

このcプログラムで は

a=8;
main()
{
    printf("%d", a);
}   

変数 a はデータ型なしで宣言されていますが、それでもこのプログラムは正常にコンパイルされ、目的の出力が得られます。
出力::

8  

ideoneでそれを参照してください。
しかし、メイン内で同じ変数を宣言すると、コンパイルエラーが発生します。

main()
{
     a=8;
    printf("%d", a);
}  

出力::

prog.c:2: warning: return type defaults to ‘int’
prog.c: In function ‘main’:
prog.c:3: error: ‘a’ undeclared (first use in this function)
prog.c:3: error: (Each undeclared identifier is reported only once
prog.c:3: error: for each function it appears in.)
prog.c:4: warning: implicit declaration of function ‘printf’
prog.c:4: warning: incompatible implicit declaration of built-in function ‘printf’  

ここを参照してください。

最初のプログラムはどのように機能していますか?

4

6 に答える 6

28

ここに表示されているのは、「暗黙の Int ルール」が機能していることです。簡単に言えば、ルールは次のように述べています。

「明示的な型名なしで宣言された変数はint、型であると見なされます。」

この規則は c99 標準[参照 1]で廃止されたことに注意してください。ただし、コンパイラとその設定によっては、最初の例が警告付きでコンパイルされるか、コンパイルに失敗する可能性があります (厳密なコンパイル設定で) 。

最初の例を c99 標準に準拠した厳密な設定でコンパイルすると、コンパイラは根本的な原因を教えてくれます。

ここで確認してください。

cc1: 警告はエラーとして扱われます
prog.c:1: エラー: データ定義に型またはストレージ クラスがありません
prog.c:1: エラー: 'a' の宣言で型のデフォルトが 'int' になっています<br> prog.c: 3: エラー: 戻り値の型のデフォルトは 'int' です<br> prog.c: 関数 'main' 内:
prog.c:4: エラー: 関数 'printf' の暗黙の宣言です<br> prog.c:4: エラー:組み込み関数 'printf' の暗黙の宣言に互換性がありません

編集:

最初の例は機能するのに、2 番目の例は機能しないのはなぜですか?

ルールで「宣言された変数」という言葉が強調されていることに注意してください。

最初の例では、ステートメントはグローバル スコープにあるため、暗黙の宣言として扱われ、暗黙の Int ルールが適用されます。

2 番目の例では、ステートメントはDeclaration ではなく Assignmentとして機能します。宣言がないため、ここではImplicit int ルールは適用されません。型がない場合、コンパイラは型を判別できないためa、エラーが報告されます。


[参照 1]

C99 標準: 序文
第 5 項:

この版は、 、、およびISO/IEC 9899:1990によって修正および修正された前版 に置き換わるものです。 前の版からの主な変更点は次のとおりです: ..... ..... — 暗黙の int を削除 ..... ..... ISO/IEC 9899/COR1:1994ISO/IEC 9899/COR2:1995ISO/IEC 9899/AMD1:1995





于 2012-06-16T14:38:25.900 に答える
7

a=8;関数の外側は、宣言ステートメントのように見えます。ここaで、 は宣言指定子で、= 8は初期化子です。C では、宣言指定子で型を省略できint、その場合はデフォルトで省略されていました。(C99 以降、これは許可されなくなりました。)

ただし、関数内では、式文a=8;(代入式) のように見え、シンボルが解決されません。(関数の外に式ステートメントがないことに注意してください。)a

たとえば、実行しようとすると、static a = 8;再び宣言のように見え、型がデフォルトで int になるため、コンパイルする必要があります。

とにかく、それに頼らないでください :-) 型を明確に記述してください。

于 2012-06-16T14:46:22.580 に答える
3

Cでは、変数/関数は暗黙的intに .

registerこれは、代わりにregister int、またはunsigned代わりにunsigned intauto代わりにauto int、およびstatic代わりに使用できるのと同じ理由ですstatic int。私は常に自分の変数を で明示的に修飾していますがint、そうするかどうかはあなたの選択です。

于 2012-06-16T14:41:19.770 に答える
0

データ型を記述していなくても、変数にはデータ型 (int) があります。

その機能を利用するのは悪い習慣です。

どうやらあなたのコンパイラはそれが関数内で起こることを許可していません。「a = 8;」を許可した場合、それは理にかなっています。関数では、特定のタイプミスを見つけるのは非常に困難です。

于 2012-06-16T14:41:57.440 に答える
0

C++11 には、キーワードがあります。auto 残念ながら、C と C++ は厳密に型指定された言語であり、宣言された変数ごとに厳密な型を定義する必要があります。一部のコンパイラは int を default と想定していますが、それは間違ったプログラミングの習慣として認識されているため、使用すべきではありません。

于 2012-06-16T14:45:04.217 に答える