2016-11-04 6 views
1
#include <stdio.h> 

int x=3; 
int main() 
{ 
    int x=4; 
    printf("%d",x); 

    return 0; 
} 

私たちが知っているように、ローカル宣言はグローバル宣言としても機能します。 xは既に3としてグローバルに宣言されているため、新しい宣言(非暫定)は、ローカル宣言の場合に複数の非仮定義の「マージ」が行われないため、再宣言エラーを引き起こしませんか?なぜこのコードに再宣言エラーはありませんか?

+7

再コンパイルエラーがないためです。 –

+0

私たちは誰ですか?地元の宣言がグローバルな宣言のように機能することを知っている理由は何ですか? –

答えて

4

ここでは、scopeとなります。 main()内部

main()内部xスコープとオーバーライド(影)をブロック有するグローバルx

関連、C11、チャプタ§6.2.1、"識別子のスコープ"、引用(強調鉱山

[...]識別子が同じ2つの異なるエンティティを指定した場合名前が の場合、スコープが重複する可能性があります。その場合、あるエンティティ(内部スコープ)のスコープは、他のエンティティ(スコープ)のスコープの前に完全に終了します( )。 内部スコープ内で、 識別子は、内部スコープで宣言されたエンティティを指定します。外側の スコープ内で宣言されたエンティティは、内側のスコープ内に隠されています(また、表示されません)。

+1

* gcc *の '-Wshadow'はそれについて警告します。' for'、 'while'または' if'ブロックの中でローカル宣言をシャドーすると特に役に立ちます。 –

+0

C標準の不器用な言葉では、関数スコープとブロックスコープは2つの異なるものです。関数スコープは、ラベルを参照することを指します。 – Lundin

+1

@iharob絶対に正しいですが、意図的に実行された場合は何も_wrong_(例:複数のカウンタ)です –

2

私たちは、地元の宣言が間違っているグローバル宣言

号として働き知っているように。

グローバルxは、ローカルxの存在下でmainには表示されません。コンパイラは、C標準で許可されているような警告やエラーを生成しません。 変数のスコープが異なります。 main外のxは、グローバルスコープを持ち、main内のxは機能スコープを持ちます。

関連する問題