2010-11-22 15 views
30

在流量控制的C switch-case中,如果在该块中定义了变量,则需要在case之后放置大括号{}C每个案例之后的开关大括号

无论变量声明如何,在每个case之后插入大括号是否是不好的做法?

例如:

switch(i) { 
    case 1: { 
    int j = 4; 
    ...code... 
    } break; 

    case 2: { //No variable being declared! Brace OK? 
    ...code... 
    } break; 
} 

回答

33

在每个大小写块中使用大括号当然不是无效的,它也不一定是坏的风格。如果由于变量声明而使用了大括号,那么向别人添加大括号可以使编码风格更加一致。这就是说,在直接C中声明变量块内的变量可能不是一个好主意。尽管编译器可能允许这样做,但可能有更清晰的解决方案。相互独占的大小写块可能能够共享几个常见的临时变量,或者您可能会发现您的大小写块作为辅助函数可以更好地工作。

+2

只需要注意 - 可以在第一种情况之前在开关的开始处声明变量(并因此在不添加更多花括号的情况下共享这些变量。 – martinkunev 2016-01-14 16:04:37

8

牙套可以在每种情况下语句中使用而没有任何速度的损失,由于方式的编译器优化代码。所以这只是编码器的风格和偏好。

  • 最优选使用不使用大括号,但他们在任何情况下一个活跃的开发过程中的使用可能会发现更容易做出一些补充的代码飘飞。

  • 这只是东方美学;因为'case'语句不只需要一个命令,而是会在代码中作为标签工作。所以块不是必需的,并且不是无效的。

  • 在'有变数的情况下;使用大括号来为变量创建上下文,使用它们非常有意义。如果不包括在不同平台上的一些编译器显示不同的行为。

+0

你知道是否有速度惩罚,或只是风格点损失? – Ben 2010-11-22 01:56:25

+0

没有速度惩罚,它编译像你没有他们。我正在编辑包含此内容的答案。 – SuperDuck 2010-11-22 09:33:35

+0

谢谢Duck,不幸的@ bta的解决方案在我的头脑中有点清晰,但+1帮助你。 – Ben 2010-11-23 05:26:34

0

我认为在每个case中使用花括号是很糟糕的风格。案例是C中的标签,类似于goto标签。在当前的C语言中,您可以自由地在每个case(或任何你喜欢的地方)声明变量,而不需要引入新的块,尽管有些人(包括我自己)也会考虑这种糟糕的风格。

+2

但是如果你不分隔块,你在'case'中声明的任何变量将在下一个块中可用。如果你有任何大的“开关”,它可能会产生一些令人讨厌的错误;更好的分隔块,或者将它们减少到比函数调用更多的地步。 – Javier 2010-11-22 01:50:31

+0

@R和其他人 - 啊 - 所以在块中定义变量的实际做法可能很糟糕? – Ben 2010-11-22 01:54:42

+0

@Javier - 我的一些编译器没有大括号就崩溃了; “在下一个可用”显然不会发生... – Ben 2010-11-22 01:55:35

5

通常不好的做法是跳过变量的初始化,使用gotoswitch。当您没有case的块时,会发生这种情况。

在C99中甚至有一种情况是跳过初始化是非法的,即可变长度数组。它们必须与C++中的非POD类似地“构造”,它们的初始化对于稍后访问该变量是必需的。所以在这种情况下你必须使用块语句。

+0

+1为什么在'switch'中初始化一个var是不好的,谢谢你的想法。 – Ben 2010-11-23 05:19:23

0

只是为了添加一个小点许多编辑器& IDE允许块被折叠和/或自动缩进,并且有几个允许你跳转到匹配的支撑 - 我个人不知道任何允许你从打破匹配的案例陈述。

当调试或重新构造其他人(甚至在几个月后你自己的)时,包含复杂case语句的代码能够折叠代码段并跳转到匹配的情况是非常有价值的, 特别是如果代码包含缩进变体

这就是说,几乎总是很好的建议,以避免像鼠疫这样复杂的病例陈述。