プログラミング言語において、ラベルとは、ソースコード内の位置を識別するための文字列のことである。ほとんどの言語では、ラベルは識別子の形をとり、その後に句読点(コロンなど)が続くことが多い。多くの高級言語では、ラベルの目的はGOTO文の宛先として機能することである。[1] [2]アセンブリ言語 では、ラベルはアドレスを使用できる場所であればどこでも使用できる(たとえば、 または 命令のオペランドとしてJMP)MOV。[3] Pascalとその派生言語 でも同様である。FortranやBASICなどの一部の言語では、数値ラベルがサポートされている。[4]ラベルは、コンパイルされた文のシーケンス へのエントリポイントを識別するためにも使用される(たとえば、デバッグ中)。
C
Cでは、ラベルはコード内のステートメントを識別します。1 つのステートメントに複数のラベルを設定できます。ラベルはコード内の場所を示すだけであり、ラベルに到達しても実際の実行には影響しません。
関数ラベル
関数ラベルは、識別子とそれに続くコロンで構成されます。各ラベルは関数内のステートメントを指し、その識別子はその関数内で一意である必要があります。他の関数はラベルに同じ名前を使用できます。ラベル識別子は独自の名前空間を占有します。つまり、ラベルと同じ名前の変数と関数を持つことができます。
void foo ( int number ) { if ( number < 0 ) goto error ; bar ( number ); return ; error : fprintf ( stderr , "無効な数値です! \n " ); }
ここでerrorはラベルです。goto ステートメントは、コード内のラベル付きステートメントにジャンプするために使用できます。a の後goto、プログラムの実行はラベルの後のステートメントから続行されます。
スイッチラベル
switch ステートメントには、2 種類のラベルを配置できます。case ラベルは、キーワードcaseと、それに続く整数定数に評価される式で構成されます。default ラベルは、キーワード で構成されますdefault。case ラベルは、コード内のステートメントに整数値を関連付けるために使用されます。switch ステートメントに到達すると、プログラムの実行は、switch の括弧内の値と一致する値を持つ case ラベルの後のステートメントから続行されます。そのような case ラベルがなく、default ラベルがある場合、プログラムの実行は default ラベルの後のステートメントから続行されます。default ラベルがない場合は、switch の後からプログラムの実行が続行されます。
switch ( die ) {デフォルト: printf ( "invalid \n " ); break ;
ケース1 :ケース3 :ケース5 : printf ( "odd \n " ); break ;
ケース2 :ケース4 :ケース6 : printf ( "even \n " ); break ; }
単一のswitch ステートメント内では、各 case ラベルに関連付けられた整数定数は一意である必要があります。default ステートメントはあってもなくてもかまいません。switch 内のラベルの順序に制限はありません。case ラベルの値が整数定数に評価されるという要件により、コンパイラーはより多くの最適化の余地を得ることができます。
例
ジャバスクリプト
JavaScript 言語の構文では、ステートメントの前にラベルが付く場合があります。
top : // 最も外側の for ループにラベルを付けます。for ( var i = 0 ; i < 4 ; i ++ ) { for ( var j = 0 ; j < 4 ; j ++ ) { if ( j === 3 && i === 2 ) { alert ( "i=" + i + ", j=" + j ); //i=2, j=3 break top ; } } }
アラート( "i=" + i + ", j=" + j ); //i=2, j=3
breakステートメントを使用してコード ブロックから抜け出す
こともできます。
上部: { console.log ( " foo " ) console.log ( " bar " ) break上部console.log ( " baz " )
}
// 出力は次のようになります:
// > foo
// > bar
コモンリスプ
Common Lispでは、ラベルを定義する方法が 2 つあります。1 つ目はtagbody特殊演算子を使用する方法です。C などのグローバルナビゲーションを許可する他の多くのプログラミング言語とは異なり、ラベルはこの演算子のコンテキストでのみアクセスできます。ラベルの内部は、tagbodyシンボルで始まるフォームとして定義され、go特殊フォームにより、これらのラベル間で制御を転送できます。[5]
( let (( iteration NIL )) ( tagbody start ( print 'started ) ( setf iteration 0 ) increase ( print iteration ) ( incf iteration 1 ) ( go check ) check ( if ( >= iteration 10 ) ( go end ) ( go increase )) end ( print 'done )))
2つ目の方法は、リーダーマクロとを使用するもので、前者は直後のオブジェクトにラベルを付け、後者はその評価された値を参照します。[6]この意味でのラベルは、むしろ変数の代替手段であり、「変数」を宣言して初期化し、それにアクセスします。プレースホルダーnは、ラベルを識別する選択された符号なし10進整数を指定します。
#n=#n##n=#n#
(プログラム
#1 = "hello" (印刷#1# ))
blockそれ以外にも、命名を規定する特殊形式や、loop節で識別できるマクロなど、いくつかの形式では、後で参照するためのラベルの宣言が許可または義務付けられていますnamed。特殊演算子を使用すると、名前付き形式からすぐに離脱できますreturn-from。
(ブロックmyblock ( 0からの反復のループdo ( if ( >=反復10 ) ( myblockから戻り'done ) (反復を印刷))))
(ループ
名myloop 、反復回数0 、do ( if ( >=反復回数10 ) ( return-from myloop 'done ) (反復回数を印刷)))
C言語と同様に、マクロ、、、case[ 7]、およびはswitch文を定義します。[ 8]ccaseecase typecasectypecaseetypecase
( let (( my-value 5 )) ( case my-value ( 1 ( "one"を出力)) ( 2 ( "two" を出力)) (( 3 4 5 ) ( "three four or five"を出力)) ( else ( "any other value"を出力))))
( let (( my-value 5 )) ( typecase my-value ( list ( print "リスト" )) ( string ( print "文字列" )) ( number ( print "数値" )) ( else ( print "その他の型" ))))
参照
参考文献
- ^ 「C 標準セクション 6.8.6.1 goto ステートメント」。2007 年 12 月 24 日時点のオリジナルよりアーカイブ。2008 年 7 月 3 日閲覧。
- ^ 「GOTO ステートメント QuickSCREEN」。Microsoft。1988 年。2009 年 7 月 25 日時点のオリジナルよりアーカイブ。2008年 7 月 3 日に取得。
- ^ O. Lawlor. 「nasm x86 アセンブリ」 。2008年 7 月 3 日閲覧。
- ^ 「GW-BASIC と QBasic の違い」。2010 年 2 月 10 日時点のオリジナルよりアーカイブ。
- ^ ケント・ピットマン。「CLHS: 特殊オペレーター TAGBODY」。2020年8月18日閲覧。
- ^ Kent Pitman. 「CLHS: セクション 2.4.8」。2020年8月18日閲覧。
- ^ Kent Pitman. 「CLHS: Macro CASE、CCASE、ECASE」。2020年8月20日閲覧。
- ^ Kent Pitman. 「CLSH: Macro TYPECASE、CTYPECASE、ETYPECASE」。2020年8月20日閲覧。
