在使用switch-case语句时,如果使用花括号,'break'语句的作用是什么?

47

在C/Objective-C/C++中,我在所有的switch case语句中使用花括号。

直到几分钟前,我才考虑将break;语句放在括号内是好是坏。我猜想这并不重要,但我认为还是值得问一下。

    switch (foo) {
        case 1: {
            // stuff
            break;
        }

        default: {
            break;
        }
    }

对比

    switch (foo) {
        case 1: {
            // stuff
        } break;

        default: {
            // stuff
        } break;
    }

只需将case语句放在父语句的大括号内即可。 - Sam Bloomberg
我使用花括号是因为:https://dev59.com/3HVD5IYBdhLWcg3wGHeu - griotspeak
5个回答

41

简短回答:这并不重要。


我想我可以接受这个(一分钟内),但长回答中有什么有趣的东西吗? - griotspeak
1
@gritospeak:我会留给你来决定!(在我看来,长篇回答只是表达个人偏好。) - Oliver Charlesworth
3
我的偏好是在内部放置break,因为我认为花括号定义了case语句的内容,而break是这些内容的一部分。我不喜欢花括号成为case语句内容的子集。 - Jayen

16

仅给一个稍微详细一些的答案...

官方的C99规范对break语句做出以下说明:

一个break语句会结束最近的switch或iteration语句。

所以实际上没有太大区别。至于我,我把break放在花括号内部。因为你还可以在花括号的其他位置使用break,所以在花括号内部也放置结束的break更加合理。有点像return语句。


7

有很多不同的编码风格可以用来组合大括号和开关语句。我将在示例中使用我喜欢的那种方式。break语句会跳出最内层的循环或开关语句,无论其位置如何。例如,您可以在一个case语句中有多个break:

switch (foo) {
case 1:
    {
        if (bar)
            break;
        bar = 1;
        ...
    }
    break;
}

请注意,您可以将case语句放在任何地方,但这被认为是不好的实践。case标签非常像goto标签。有时我会写出下面这样的代码:
switch (foo) {
case 1:
    bar = 1;
    if (0) {
case 2:
        bar = 2;
    }
    ...
    break;
}

但要小心使用。


7
你的第二个例子让我坐立不安。 - Bradley Thomas

2

可能你本来就不需要花括号,除非你需要它们来限制变量的作用域。第一个例子看起来对我来说更好,但我想真正的答案是这是个品味问题。


1
我使用花括号来提供作用域“以防万一”,因为有这个问题:https://dev59.com/3HVD5IYBdhLWcg3wGHeu - griotspeak

1

如明确说明的那样,这只是个人风格问题,但我总是将break语句放在大括号外面:在闭合大括号之前放置break似乎会跳出一个复合语句,从而稍微增加代码混乱感。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接