C
23Switch 语句#
为什么 switch 语句需要 break;
呢?如果把 case XX:
语句看作是类似“程序跳转标记”的东西,就很好理解了。
switch (uMsg) {
case WM_CREATE:
MessageBoxW(hWnd, L"Opening...", L"Simple Title", MB_OK);
break;
case WM_MOUSEMOVE:
MessageBoxW(hWnd, L"Don't Move!", L"Warning", MB_OK);
break;
case WM_CLOSE:
MessageBoxW(hWnd, L"Closing...", L"Simple Title", MB_OK);
DestroyWindow(hWnd);
PostQuitMessage(0);
break;
}
程序跳转标记在执行 goto 之前,并不会影响程序执行。因此,在匹配到一个 case 之后,剩下的标签就没有用了,此时能够结束该 switch 语句的只有 break。
变量声明和初始化#
可以在case标签之前和之后声明或定义(但不能初始化)switch语句内的变量
switch (1)
{
int a; // okay: case标签之前可以声明变量
int b{ 5 }; // 不合法: case 标签之前,不可以初始化变量
case 1:
int y; // okay 但不推荐
y = 4; // okay: 赋值语句可以
break;
case 2:
int z{ 4 }; // 不合法: 后面还有case标签,不允许初始化变量
y = 5; // okay: y 在上面声明,所以这里可以赋值
break;
case 3:
break;
}
如果case标签内需要定义和初始化新变量,最佳实践是在case语句下的显式块内进行定义和初始化:
switch (1)
{
case 1:
{ // 这里有一个显式的代码块
int x{ 4 }; // okay, 变量在一个新的代码块内初始化
std::cout << x;
break;
}
default:
std::cout << "default case\n";
break;
}