详解C++编程中标记语句与复合语句的写法
标记语句
标签用于将程序控制权直接转交给特定语句。
identifier:statement caseconstant-expression:statement default:statement标签的范围为整个函数,已在其中声明该标签。
备注
有三种标记语句。它们全都使用冒号将某种标签与语句隔开。case和default标签特定于case语句。
#include<iostream> usingnamespacestd; voidtest_label(intx){ if(x==1){ gotolabel1; } gotolabel2; label1: cout<<"inlabel1"<<endl; return; label2: cout<<"inlabel2"<<endl; return; } intmain(){ test_label(1);//inlabel1 test_label(2);//inlabel2 }
goto语句
源程序中identifier标签的外观声明了一个标签。仅goto语句可将控制转移到identifier标签。以下代码片段阐释了goto语句和identifier标签的使用:
标签无法独立出现,必须总是附加到语句。如果标签需要独立出现,则必须在标签后放置一个null语句。
标签具有函数范围,并且不能在函数中重新声明。但是,相同的名称可用作不同函数中的标签。
//labels_with_goto.cpp //compilewith:/EHsc #include<iostream> intmain(){ usingnamespacestd; gotoTest2; cout<<"testing"<<endl; Test2: cerr<<"AtTest2label."<<endl; } //Output:AtTest2label.
case语句
在case关键字后显示的标签不能在switch语句的外部显示。(此限制也适用于default关键字。)下面的代码片段演示了case标签的正确用法:
//SampleMicrosoftWindowsmessageprocessingloop. switch(msg) { caseWM_TIMER://Processtimerevent. SetClassWord(hWnd,GCW_HICON,ahIcon[nIcon++]); ShowWindow(hWnd,SW_SHOWNA); nIcon%=14; Yield(); break; caseWM_PAINT: memset(&ps,0x00,sizeof(PAINTSTRUCT)); hDC=BeginPaint(hWnd,&ps); EndPaint(hWnd,&ps); break; default: //Thischoiceistakenforallmessagesnotspecifically //coveredbyacasestatement. returnDefWindowProc(hWnd,Message,wParam,lParam); break; }
case语句中的标签
在case关键字后显示的标签不能在switch语句的外部显示。(此限制也适用于default关键字。)下面的代码片段演示了case标签的正确用法:
//SampleMicrosoftWindowsmessageprocessingloop. switch(msg) { caseWM_TIMER://Processtimerevent. SetClassWord(hWnd,GCW_HICON,ahIcon[nIcon++]); ShowWindow(hWnd,SW_SHOWNA); nIcon%=14; Yield(); break; caseWM_PAINT: //Obtainahandletothedevicecontext. //BeginPaintwillsendWM_ERASEBKGNDifappropriate. memset(&ps,0x00,sizeof(PAINTSTRUCT)); hDC=BeginPaint(hWnd,&ps); //InformWindowsthatpaintingiscomplete. EndPaint(hWnd,&ps); break; caseWM_CLOSE: //Closethiswindowandallchildwindows. KillTimer(hWnd,TIMER1); DestroyWindow(hWnd); if(hWnd==hWndMain) PostQuitMessage(0);//Quittheapplication. break; default: //Thischoiceistakenforallmessagesnotspecifically //coveredbyacasestatement. returnDefWindowProc(hWnd,Message,wParam,lParam); break; }
goto语句中的标签
源程序中identifier标签的外观声明了一个标签。仅goto语句可将控制转移到identifier标签。以下代码片段阐释了goto语句和identifier标签的使用:
标签无法独立出现,必须总是附加到语句。如果标签需要独立出现,则必须在标签后放置一个null语句。
标签具有函数范围,并且不能在函数中重新声明。但是,相同的名称可用作不同函数中的标签。
//labels_with_goto.cpp //compilewith:/EHsc #include<iostream> intmain(){ usingnamespacestd; gotoTest2; cout<<"testing"<<endl; Test2: cerr<<"AtTest2label."<<endl; //AtTest2label. }
复合语句(块)
复合语句包含封闭在大括号({})中的零个或多个语句。可以在任何期望语句出现的位置使用复合语句。复合语句通常称为“块”。
语法
{[statement-list]}
备注
以下示例使用复合语句作为if语句的statement部分(有关语法的详细信息,请参阅if语句):
if(Amount>100) { cout<<"Amountwastoolargetohandle\n"; Alert(); } else Balance-=Amount;
注意
由于声明是一个语句,因此声明可以是statement-list内的某个语句。因此,复合语句内声明的名称(而不是显式声明为静态的名称)具有局部范围和(对于对象)生存期。