是否建议使用switch
的语法始终不需要breaks
?
我的建议是在auto
和每个案例之前插入switch
:
auto switch(expr) {
auto case 1: statement; statement;
auto case 2: statement; statement;
default: statement; statement;
}
等同于
switch(expr) {
case 1: statement; statement; break;
case 2: statement; statement; break;
default: statement; statement;
}
编译器会抱怨错误
auto switch
任何case
中没有auto
或auto case
中使用auto
- 少switch
。是否有任何解析器问题,任何歧义?
用户的错误使用错误是否还有其他好处,例如更好的优化可能性?
更新
稍微有用的情况是休息的位置不是那么清楚:
case(expr) {
case 1:
if(isThisTrue) {
print(that);
} else {
break;
}
doSomethingElse();
if(!isThisTrue) {
break;
}
......或类似的东西。
我认为预防堕落有助于防止一些难以诊断的错误。
答案 0 :(得分:2)
由于很多原因,这不是一件好事!
最明显的是:它不会保存任何时间totype auto 而不是 break
它的可读性差得多。就像没有人会建议使用goto一样,你的命题很难让decypher。想象一个长的 case 块,读者在整个读取块时必须记住这个auto关键字。除非你使用了很多goto,否则c ++阅读起来很愉快,因为你不必经常在代码中上下。
案例陈述可能不会系统地破坏,如果我选择添加一个跳过休息的条件,你的 auto 很可能会在编译时被遗忘并烦扰我。
auto 已经意味着什么。在一种语言中添加新的关键字可能很烦人,但重新使用一些具有不同含义的关键字却很糟糕!
最后回答你的问题:不,这不会导致任何解析问题。只需将auto case[...]auto
替换为case[...]break
即可。实际上,您可以定义自己的宏来做到这一点!通过这样做,你可能会意识到为什么没有必要。
类似的东西:
#define AUTO(x) x break;
switch(i){
case 1: std::cout<<1;
AUTO case 2: std::cout<<2;
AUTO default: std::cout<<i
}
注意:这个宏有点扭曲你的观点,我知道。绝对是一种方法,可以更接近您的想法,我会考虑并在有空的时候进行更新。