ラベルとgoto
ラベルは、後でプログラムのフローをその行に誘導するために、コードの行に付けられる名前である。
ラベルは、名前と:
文字で構成される。
このラベルは、定義された行に名前を付与する。
注釈:実際には、同じ行の文の間にラベルを挿入して、そのラベルが挿入された正確な位置に名前を付けることもできるが、これは一般的な方法ではない。
goto
goto
プログラムの制御を指定されたラベルに誘導する:
condition
がtrue
の場合、プログラムの制御はラベルend
に移動し、 "second"と表示する行をスキップする:
最初
3番目
goto
CおよびC++プログラミング言語と同じように機能する。コードの意図や流れを理解しにくくなることで悪名高いgoto
は、これらの言語でも使用は推奨されていない。代わりに、if
、while
、for
などの文を使用すべきだ。
例えば、前のコードは、goto
を使用せずに、より構造化された方法で記述することができる。
ただし、Cではgoto
の使用が2つの場合のみ許容されるが、Dではいずれも必要ない。
最終化領域
Cでgoto
を有効に使用する方法の1つは、関数のクリーンアップ操作(リソースの返却、特定の操作の取り消しなど)を行うファイナライズ領域に移動することだ。
Dでは、リソースを管理する他の方法 (ガベージコレクタ、デストラクタ、catch
およびfinally
ブロック、scope()
文など)があるため、goto
をこのように使用する必要はない。
注釈:このgoto
の使用は、C++でも必要ない。
continue
break
は外側のループで使用する
Cにおけるgoto
の他の有効な使用法は、外側のループに関するものだ。
continue
とbreak
は内側のループにのみ影響するため、外側のループを継続または中断する1つの方法は、goto
文を使用することだ。
同じ手法は、外側のswitch
文にも使用できる。
Dにはループラベルがあるため、このgoto
の使用は必要ない。ループラベルについては後で説明する。
注釈:このgoto
の使用法は、C++でも見られる。
コンストラクタのスキップの問題
コンストラクタは、そのオブジェクトが定義された正確な位置で呼び出される。これは主に、オブジェクトを構築するために必要な情報がその時点まで利用できないためだ。また、そのオブジェクトがプログラムで一切使用されない場合、オブジェクトを構築する必要はない。
goto
がオブジェクトが構築されている行をスキップすると、プログラムは未準備のオブジェクトを使用する可能性がある:
コンパイラはこのバグを防止する:
ループラベル
ループにはラベルを付けることができ、goto
文はそのラベルを参照することができる。
switch
文にもラベルを付けることができる。内側のbreak
文は、外側のswitch
を参照して、外側のswitch
文を中断することができる。
goto
case
セクション内
goto
case
の使用は、 switch
とcase
の章で既に説明した。
-
goto case
次のcase
まで実行を継続する。 -
goto default
実行をdefault
セクションまで継続する。 goto case expression
その式に一致するcase
に実行を続行する。
概要
goto
の使用の一部はDでは必要ない。break
また、continue
は、外側のループやswitch
文に影響を与えるラベルを指定することができる。goto
case
セクション内では、プログラムのフローを他のcase
やdefault
セクションにジャンプさせることができる。