为什么我不能在switch-case语句中有变量?

inf*_*oop 11 c++ switch-statement

这是我的代码:

bool Character::keyPress(char c)
{
    switch(c)
    {
        case up_key:
            move(0, -1);
            break;

        case down_key:
            move(0, 1);
            break;

        case left_key:
            move(-1, 0);
            break;

        case right_key:
            move(1,0);
            break;

        default:
            return false;
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)

并且编译器抱怨:

error C2051: case expression not constant
error C2051: case expression not constant
error C2051: case expression not constant
error C2051: case expression not constant
Run Code Online (Sandbox Code Playgroud)

在我的头文件中,我有:

protected:
    char up_key;
    char down_key;
    char right_key;
    char left_key;
Run Code Online (Sandbox Code Playgroud)

我正在使用Visual C++ 2008.

Jan*_*nne 15

正如错误消息所述,case表达式必须是常量.编译器在编译时将其构建为一个非常快速的查找表,如果程序运行时值可能会发生变化,则无法执行此操作.

如果你确实需要它们是变量而不是常量,那么最好的办法就是使用if/else语句.


小智 7

替换这个长笨拙的代码,

switch(c)
{
    case up_key:
        move(0, -1);
        break;

    case down_key:
        move(0, 1);
        break;

    case left_key:
        move(-1, 0);
        break;

    case right_key:
        move(1,0);
        break;

    default:
        return false;
}
Run Code Online (Sandbox Code Playgroud)

用这样的东西:

move( (c==right_key) - (c==left_key) , (c==down_key) - (c==up_key) );
Run Code Online (Sandbox Code Playgroud)

您可以使用更整齐的单行代码轻松地替换17行代码.

  • 是什么让你觉得那个代码很整洁? (9认同)
  • 它不会增加时间复杂度吗?4个比较,4个类型演员和2个关节镜片将用你的单线制作! (2认同)