ブロック・ステートメント または複合ステートメント を使用すると、任意の数のデータ定義、宣言、およびステートメントを 1 つのステートメントにまとめられます。 1 組の中括弧に囲まれた定義、宣言、およびステートメントはすべて、 単一のステートメントとして扱います。 単一のステートメントが使用可能な場所ならばどこでもブロックを使用する ことができます。
ブロック・ステートメントの形式は、次のとおりです。
.----------------------------------. .---------------. V | V | >>-{----+------------------------------+-+----+-----------+-+--}->< +-type_definition--------------+ '-statement-' +-file_scope_data_declaration--+ '-block_scope_data_declaration-'
C89 言語レベルでは、定義および宣言はステートメントの前に配置しなければなりません。
C99 言語レベルの C および Standard C++ および C++98 では、宣言および定義を任意の位置に配置し、 他のコードと混在させることができます。
ブロックは、ローカル・スコープを定義します。 データ・オブジェクトがブロック内で使用可能であり、その ID が再定義されていない場合には、 ネストされたすべてのブロックが、そのデータ・オブジェクトを使用できます。
ブロックの例
以下のプログラムは、ネストされたブロック内でデータ・オブジェクト の値がどのように変更されるかを示しています。
/** ** This example shows how data objects change in nested blocks. **/ #include <stdio.h> int main(void) { int x = 1; /* Initialize x to 1 */ int y = 3; if (y > 0) { int x = 2; /* Initialize x to 2 */ printf("second x = %4d¥n", x); } printf("first x = %4d¥n", x); return(0); }
プログラムは、以下の出力を作成します。
second x = 2 first x = 1
x という名前の 2 つの変数が main の中で定義されています。 x の最初の定義は、main が実行されている間、ストレージを保存します。 しかし、x の 2 番目の定義 (再定義) がネストされたブロック内で発生するため、 printf("second x = %4d¥n", x); は、x を前の行で定義された変数であると認識します。 printf("first x = %4d¥n", x); は、 ネストされたブロックの一部ではないので、x は、x の最初の定義として認識されます。
関連参照