Инструкции с метками
Метки используются для передачи управления программой непосредственно указанному оператору.
Синтаксис
labeled-statement
:
identifier
:
statement
case
constant-expression
:
statement
default
:
statement
Область метки — это вся функция, в которой она объявлена.
Замечания
Существует три типа операторов с метками. Все используют двоеточие (:
) для разделения некоторых типов меток от инструкции. default
Метки case
относятся к операторам регистра.
#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
оператор
Внешний вид метки в исходной identifier
программе объявляет метку. goto
Только инструкция может передавать управление identifier
меткой. Следующий фрагмент кода иллюстрирует использование инструкции goto
и identifier
метки:
Метка не может отображаться сама по себе, но всегда должна быть присоединена к оператору. Если необходимо использовать метку самостоятельно, поместите оператор null после метки.
Метка имеет функцию область и не может быть повторно объявлена в функции. Однако одно и то же имя может использоваться как метка в разных функциях.
// 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
Метки, которые отображаются после 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;
case WM_CLOSE:
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;
}
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по