Logo 逆向知识库

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;
}

参考