For faster navigation, this Iframe is preloading the Wikiwand page for ネスティング.

ネスティング

この記事は検証可能参考文献や出典が全く示されていないか、不十分です。 出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方)出典検索?"ネスティング" – ニュース · 書籍 · スカラー · CiNii · J-STAGE · NDL · dlib.jp · ジャパンサーチ · TWL (2013年8月)
マトリョーシカ人形
プログラムの記述と比較してみると似ていることが分かる(参照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()のようにアクセスさせることが多い
	}
}

関連項目

[編集]

プログラミング

[編集]

その他

[編集]

外部リンク

[編集]
{{bottomLinkPreText}} {{bottomLinkText}}
ネスティング
Listen to this article

This browser is not supported by Wikiwand :(
Wikiwand requires a browser with modern capabilities in order to provide you with the best reading experience.
Please download and use one of the following browsers:

This article was just edited, click to reload
This article has been deleted on Wikipedia (Why?)

Back to homepage

Please click Add in the dialog above
Please click Allow in the top-left corner,
then click Install Now in the dialog
Please click Open in the download dialog,
then click Install
Please click the "Downloads" icon in the Safari toolbar, open the first download in the list,
then click Install
{{::$root.activation.text}}

Install Wikiwand

Install on Chrome Install on Firefox
Don't forget to rate us

Tell your friends about Wikiwand!

Gmail Facebook Twitter Link

Enjoying Wikiwand?

Tell your friends and spread the love:
Share on Gmail Share on Facebook Share on Twitter Share on Buffer

Our magic isn't perfect

You can help our automatic cover photo selection by reporting an unsuitable photo.

This photo is visually disturbing This photo is not a good choice

Thank you for helping!


Your input will affect cover photo selection, along with input from other users.

X

Get ready for Wikiwand 2.0 🎉! the new version arrives on September 1st! Don't want to wait?