ネスティング

マトリョーシカ人形
プログラムの記述と比較してみると似ていることが分かる(参照1)(参照2

構造化プログラミングにおけるネスティング: Nesting)、ネスト入れ子とは、プログラムの構造が再帰的に繰り返されて記述されること。このような構造をネスト構造: Nested structure)、入れ子構造と呼ぶ。この記事ではC言語風の擬似コードを用いるが、ネスティングの概念はC言語に限らない。また、名前空間などC言語にない機能についても記述している。

概要

[編集]

ネスティングには主に次の3パターンが存在する。

例えば、二分木と呼ばれるデータ構造はデータ構造のネスティングの好例である。

制御構造におけるネスティング

[編集]

制御構造分岐命令ループ命令)のネスティング。スコープが入れ子になっている。

条件文のネスティング

[編集]

以下の例では条件式1を判定して判定結果が""であるなら条件式2を判定し、条件式2の判定結果も""なら条件式3を判定する。条件式3も同様に判定結果が""であるなら処理1、処理2、処理3を全て処理した後に入れ子から脱出するが、それまでに条件式2が""なら処理3だけを、条件式3が""なら処理2と処理3をして入れ子から脱出する。


C言語風での記述)

if (条件式1){    if (条件式2){     // ここの「if」は一番上の「if」の入れ子       if (条件式3){   // ここの「if」は一つ上の「if」と一番上の「if」の入れ子          処理1;       }       処理2;    }   処理3; } 

ループ文のネスティング

[編集]

基本的に上述の条件文と動きが似ているため、記述も似ている。ループ文同士での入れ子はループ文を多用するために、プログラミングのミスによるバグの一つである無限ループが発生しやすくなる。

一番外側から順番に条件式を判定して行き、条件式の値が満たされなくなるまで内側の処理を繰り返していく。

C言語風での記述)

for (int x = 0; 条件式1; x++){    for (int y = 0; 条件式2; y++){   //ここの「for」は一番上の「for」の入れ子       for (int z = 0; 条件式3; z++){ //ここの「for」は一つ上の「for」と一番上の「for」の入れ子           処理1;       }       処理2    }    処理3; } 

ループ文と条件文が混合したネスティング

[編集]

一番外側から順番に条件式を判定して行き、条件式の値が満たされなくなるまで内側の処理を繰り返していく。ただし外側から二番目のループ文では、条件式3の判定結果がのときは処理1を、のときは処理2を処理する。

C言語風での記述)

for (int x = 0; 条件式1; x++){    for (int y = 0; 条件式2; y++){ //ここの「for」は一番上の「for」の入れ子       if (条件式3){                //ここの「if」は一つ上の「for」と一番上の「for」の入れ子           処理1;       }       else{           処理2;       }   } } 

データ構造におけるネスティング

[編集]

構造体クラスインタフェースにおけるネスティング。

構造体のネスティング

[編集]

構造体がメンバとして何らかの構造体を持っている状態は、構造体をネストしていると言える。

struct Point { 	int x; 	int y; };  struct BitmapImage { 	struct Point size; 	unsigned char *image; }; 

副プログラムにおけるネスティング

[編集]

サブルーチンプロシージャコルーチンにおけるネスティング。単に別のサブルーチンなどを呼び出すだけの場合や再帰呼び出しを指す場合もある。

サブルーチンのネスティング

[編集]

以下の例はgccでのみコンパイル可能。

void message(void){ 	void hello(){  }// ネストされた関数定義 	hello(); //ネストされた関数の呼び出し } //ここではhello()は呼び出せない 

名前空間のネスティング

[編集]

記述方法は先述のデータ構造の入れ子に酷似している。名前空間を分けることでサブルーチンなどの名称が競合するのを防止する。ちなみに、C言語には名前空間の機能はない。

namespace 名前空間1{ 	namespace 名前空間2{ 		int func(){} //名前空間1::名前空間2::func()のようにアクセスさせることが多い 	} } 

関連項目

[編集]

プログラミング

[編集]

その他

[編集]

外部リンク

[編集]