在C switch-case
流量控件中,如果在该块中定义了变量,则需要在case
之后放置大括号 {} 。
不管变量声明如何,在每个case
之后放置大括号是不好的做法吗?
例如:
switch(i) {
case 1: {
int j = 4;
...code...
} break;
case 2: { //No variable being declared! Brace OK?
...code...
} break;
}
答案 0 :(得分:37)
在每个案例块中使用大括号当然不是无效的,也不一定是糟糕的风格。如果由于变量声明而有一些带有大括号的大小写块,则向其他大小写添加大括号可以使编码样式更加一致。
话虽如此,在C语言块中声明变量可能不是一个好主意。虽然编译器可能允许这样做,但可能有一个更清晰的解决方案。相互排斥的大小写块可能能够共享几个常见的临时变量,或者您可能会发现您的大小写块可以更好地作为辅助函数。
答案 1 :(得分:10)
由于编译器优化代码的方式,可以在每个case语句中使用大括号而不会有任何速度损失。所以这只是编码器的风格和偏好。
最优选的用法是不使用大括号,尽管在活动开发期间在每种情况下使用大括号可能会更容易在代码中不时添加一些内容。
这只是东方美学;因为'case'语句不需要只有一个命令,但是当它作为标签工作时会遍历代码。因此不需要块,也不是无效的。
在包含变量的案例中;大括号只是用在案例中,用于为变量创建上下文,使用它们很有意义。如果不包括在内,不同平台上的某些编译器会显示不同的行为。
答案 2 :(得分:5)
通常,跳过变量的初始化是不好的做法,无论是goto
还是switch
。当你没有每case
的块时会发生这种情况。
在C99中甚至有一种情况,即跳过初始化是非法的,即可变长度数组。它们必须与C ++中的非POD类似地“构造”,它们的初始化对于稍后访问变量是必要的。所以在这种情况下,必须使用块语句。
答案 3 :(得分:1)
我认为在每个case
中使用大括号是不好的方式。案例是C中的标签,类似于goto
标签。在当前的C语言中,您可以自由地在每个case
(或任何您喜欢的地方)声明变量,而不会引入新的块,尽管有些人(包括我自己)也会考虑这种不好的风格。
答案 4 :(得分:0)
只是为了添加一个小点,许多编辑和& IDE允许块折叠和/或自动缩进,有几个允许你跳转到匹配的括号 - 我个人不知道任何允许你从中断跳转到匹配的case语句。
在调试或重新分解其他人(或几个月后甚至是你自己的人)时,包含复杂案例陈述的代码能够同时折叠代码部分并跳转到匹配的案例是非常宝贵的,< em>特别是如果代码包含缩进变体。
这就是说避免像瘟疫那样复杂的案例陈述几乎总是好建议。