为了未来的读者和我自己的理智,我希望绝对清楚地表明switch
没有default
案件的陈述(由于所有案件都被覆盖)或顺序不得省略if-elseif-else
以及不应做任何事情的最终其他内容,并包含对该效果的评论(参见示例)。
但是,每当我在default
语句中包含switch
个案并将其保留为空时,我必须在default
个案例或编译器错误中加一个分号:“Line [Line of Line]关闭开关声明的大括号]`缺少';'在'}'之前发生。 为什么?!的
示例:生成编译器错误
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 */;
}
答案 0 :(得分:12)
因为您需要针对default
案例的陈述。分号是空语句。
答案 1 :(得分:9)
6.1 / 1在C ++ 03中给出了标签语句的语法:
labeled-statement: identifier : statement case constant-expression : statement default : statement
C ++ 11是相同的,除了你可以在标签之前有属性。
在C ++中,零长度标记序列不是语句,因此default:
本身不是标记语句。
那就是说,我不知道为什么标记语句的语法不允许default: statementopt
的动机是什么。如果确实如此,那么如果你写default : case 1: break;
,case 1: break;
是属于default:
的陈述,或者default:
是否存在语法模糊性没有自己的陈述,但紧接着是一个。毫无疑问它意味着什么,但也许它被认为会弄乱人们的解析器。