ラベル付きステートメントLabeled Statements

ラベルはプログラムの制御を特定のステートメントに直接移動するために使用されます。Labels are used to transfer program control directly to the specified statement.

identifier :  statement
case constant-expression :  statement
default :  statement

ラベルのスコープはラベルが宣言されている関数全体です。The scope of a label is the entire function in which it is declared.

RemarksRemarks

次の 3 種類のラベル付きステートメントがあります。There are three types of labeled statements. すべての種類で、そのタイプのラベルをステートメントと区切るためにコロンが使用されます。All use a colon to separate some type of label from the statement. case ラベルと default ラベルは、case ステートメントに固有です。The case and default labels are specific to case statements.

#include <iostream>
using namespace std;

void test_label(int x) {

    if (x == 1){
        goto label1;
    }
    goto label2;

label1:
    cout << "in label1" << endl;
    return;

label2:
    cout << "in label2" << endl;
    return;
}

int main() {
    test_label(1);  // in label1
    test_label(2);  // in label2
}

Goto ステートメントThe goto statement

外観を識別子ソース プログラム内のラベルのラベルを宣言します。The appearance of an identifier label in the source program declares a label. のみ、 gotoステートメントに制御を転送できる、識別子ラベル。Only a goto statement can transfer control to an identifier label. 次のコード フラグメントの使用を示しています、 gotoステートメントおよび識別子ラベル。The following code fragment illustrates use of the goto statement and an identifier label:

ラベルは単独では使用できず、常にステートメントと一緒に使用する必要があります。A label cannot appear by itself but must always be attached to a statement. ラベルのみが必要な場合は、ラベルの後に null ステートメントを置きます。If a label is needed by itself, place a null statement after the label.

ラベルには関数スコープがあるため、同じ関数内で再宣言できません。The label has function scope and cannot be redeclared within the function. ただし、違う関数内に同じ名前をラベルとして使用することはできます。However, the same name can be used as a label in different functions.

// labels_with_goto.cpp
// compile with: /EHsc
#include <iostream>
int main() {
   using namespace std;
   goto Test2;

   cout << "testing" << endl;

   Test2:
      cerr << "At Test2 label." << endl;
}

//Output: At Test2 label.

Case ステートメントThe case statement

後に表示されるラベル、ケースキーワードは外にも指定できません、切り替えるステートメント。Labels that appear after the case keyword cannot also appear outside a switch statement. (この制限にも適用されます、既定キーワードです)。次のコード フラグメントの正しい使用方法を示しています。ケースラベル。(This restriction also applies to the default keyword.) The following code fragment shows the correct use of case labels:

// Sample Microsoft Windows message processing loop.
switch( msg )
{
   case WM_TIMER:    // Process timer event.
      SetClassWord( hWnd, GCW_HICON, ahIcon[nIcon++] );
      ShowWindow( hWnd, SW_SHOWNA );
      nIcon %= 14;
      Yield();
      break;

   case WM_PAINT:
      memset( &ps, 0x00, sizeof(PAINTSTRUCT) );
      hDC = BeginPaint( hWnd, &ps );
      EndPaint( hWnd, &ps );
      break;

   default:
      // This choice is taken for all messages not specifically
      //  covered by a case statement.

      return DefWindowProc( hWnd, Message, wParam, lParam );
      break;
}

Case ステートメント内のラベルLabels in the case statement

後に表示されるラベル、ケースキーワードは外にも指定できません、切り替えるステートメント。Labels that appear after the case keyword cannot also appear outside a switch statement. (この制限にも適用されます、既定キーワードです)。次のコード フラグメントの正しい使用方法を示しています。ケースラベル。(This restriction also applies to the default keyword.) The following code fragment shows the correct use of case labels:

// Sample Microsoft Windows message processing loop.
switch( msg )
{
   case WM_TIMER:    // Process timer event.
      SetClassWord( hWnd, GCW_HICON, ahIcon[nIcon++] );
      ShowWindow( hWnd, SW_SHOWNA );
      nIcon %= 14;
      Yield();
      break;

   case WM_PAINT:
      // Obtain a handle to the device context.
      // BeginPaint will send WM_ERASEBKGND if appropriate.

      memset( &ps, 0x00, sizeof(PAINTSTRUCT) );
      hDC = BeginPaint( hWnd, &ps );

      // Inform Windows that painting is complete.

      EndPaint( hWnd, &ps );
      break;

   case WM_CLOSE:
      // Close this window and all child windows.

      KillTimer( hWnd, TIMER1 );
      DestroyWindow( hWnd );
      if ( hWnd == hWndMain )
         PostQuitMessage( 0 );  // Quit the application.
      break;

   default:
      // This choice is taken for all messages not specifically
      //  covered by a case statement.

      return DefWindowProc( hWnd, Message, wParam, lParam );
      break;
}

GoTo ステートメント内のラベルLabels in the goto statement

外観を識別子ソース プログラム内のラベルのラベルを宣言します。The appearance of an identifier label in the source program declares a label. のみ、 gotoステートメントに制御を転送できる、識別子ラベル。Only a goto statement can transfer control to an identifier label. 次のコード フラグメントの使用を示しています、 gotoステートメントおよび識別子ラベル。The following code fragment illustrates use of the goto statement and an identifier label:

ラベルは単独では使用できず、常にステートメントと一緒に使用する必要があります。A label cannot appear by itself but must always be attached to a statement. ラベルのみが必要な場合は、ラベルの後に null ステートメントを置きます。If a label is needed by itself, place a null statement after the label.

ラベルには関数スコープがあるため、同じ関数内で再宣言できません。The label has function scope and cannot be redeclared within the function. ただし、違う関数内に同じ名前をラベルとして使用することはできます。However, the same name can be used as a label in different functions.

// labels_with_goto.cpp
// compile with: /EHsc
#include <iostream>
int main() {
   using namespace std;
   goto Test2;

   cout << "testing" << endl;

   Test2:
      cerr << "At Test2 label." << endl;
// At Test2 label.
}

関連項目See also

C++ ステートメントの概要Overview of C++ Statements
switch ステートメント (C++)switch Statement (C++)