3

为了将来的读者和我自己以后的理智,我想绝对清楚地switch说明,不能省略没有default案例(由于涵盖了所有案例)或if-elseif-else与不应做任何事情的最终 else连续的语句并包含对此的评论(参见示例)。

但是,每当我default在语句中包含 caseswitch并将其留空时,我必须在defaultcase 中放置一个分号,否则会出现编译器错误:“ Line [Line of closing Bracket of switch statement]`missing ';' 在 '}'" 发生之前。为什么?!

示例:生成编译器错误

switch(direction) {
    case MOVE_UP:
    //...
    break;
    case MOVE_RIGHT:
    //...
    break;
    case MOVE_DOWN:
    //...
    break;
    case MOVE_LEFT:
    //...
    break;
    default:
        /* DO NOTHING */
}

示例:不生成编译器错误

switch(direction) {
    case MOVE_UP:
    //...
    break;
    case MOVE_RIGHT:
    //...
    break;
    case MOVE_DOWN:
    //...
    break;
    case MOVE_LEFT:
    //...
    break;
    default:
        /* DO NOTHING */;
}
4

2 回答 2

12

因为您需要为您的default案件提供一份声明。分号是一个空语句。

于 2012-05-21T18:11:49.817 回答
9

C++03 中的 6.1/1 给出了标记语句的语法:

标记语句标识符语句
    case常量表达式语句
    默认值:语句

C++11 是一样的,只是你可以在标签之前有属性。

零长度的标记序列不是 C++ 中的语句,因此default:它本身不是标记语句

也就是说,我不知道为什么标记语句的语法不允许的动机是什么。如果是这样,那么如果您写了,则该语句是否属于,或者是否没有自己的语句,但紧随其后,则会出现语法歧义。仍然毫无疑问它意味着什么,但也许人们认为它会弄乱人们的解析器。default: statementoptdefault : case 1: break;case 1: break;default:default:

于 2012-05-21T18:20:57.250 回答