C++プログラミングにおけるタグ文と複合文の書き方を詳しく理解する

4655 ワード

タグ文ラベルは、プログラム制御権を特定の文に直接渡すために使用されます.

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


ラベルの範囲は関数全体で、ラベルが宣言されています.
コメント
タグ文は3種類あります.これらはすべて、あるラベルと文をコロンで区切っています.caseおよびdefaultラベルはcase文に固有です.

#include  
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文ソースプログラムのidentifierラベルの外観にラベルが宣言されています.goto文のみがidentifierラベルに制御を移行します.次のコードクリップはgoto文とidentifierラベルの使用を説明します.ラベルは独立して表示されず、常に文に添付する必要があります.ラベルが独立して表示される必要がある場合は、ラベルの後にnull文を配置する必要があります.ラベルには関数の範囲があり、関数で再宣言できません.ただし、同じ名前は異なる関数のラベルとして使用できます.

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

  cout << "testing" << endl;

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

//Output: At Test2 label.


case文caseキーワードの後に表示されるラベルはswitch文の外部に表示されません.(この制限はdefaultキーワードにも適用されます.)次のコードクリップはcaseラベルの正しい使い方を示しています.

// 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文のラベルcaseキーワードの後に表示されるラベルはswitch文の外部に表示されません.(この制限はdefaultキーワードにも適用されます.)次のコードクリップはcaseラベルの正しい使い方を示しています.

// 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文のラベルソースプログラムのidentifierラベルの外観にラベルが宣言されています.goto文のみがidentifierラベルに制御を移行します.次のコードクリップはgoto文とidentifierラベルの使用を説明します.ラベルは独立して表示されず、常に文に添付する必要があります.ラベルが独立して表示される必要がある場合は、ラベルの後にnull文を配置する必要があります.ラベルには関数の範囲があり、関数で再宣言できません.ただし、同じ名前は異なる関数のラベルとして使用できます.

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

  cout << "testing" << endl;

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


複合文(ブロック)複合文には、括弧({})に囲まれた0つ以上の文が含まれます.複合文は、任意の所望の文が現れる場所で使用できます.複合文は通常「ブロック」と呼ばれます.構文

{ [ statement-list ] }

注記次の例では、if文のstatementセクションとして複合文を使用します(構文の詳細はif文を参照).

if( Amount > 100 )
{
  cout << "Amount was too large to handle
"; Alert(); } else Balance -= Amount;

宣言は文であるため、宣言はstatement-list内の文であってもよいことに注意してください.したがって、複合文内で宣言された名前(静的な名前として明示的に宣言されるのではなく)には、ローカル範囲と(オブジェクトの場合)生存期間があります.