为什么switch语句上有奇怪的缩进?

时间:2010-12-22 12:13:05

标签: java c syntax

为什么imho缺少“case”缩进 - switch语句中的关键字被认为是好的风格?

“case”关键字的缩进似乎不是每个IDE中的默认格式选项:

switch (i){
case 0:
    break;
case 1:
    break;
}

虽然我发现这种格式更直观:

switch (i){
    case 0:
        break;
    case 1:
        break;
}

这背后是否有一些逻辑,这让我望而却步?

6 个答案:

答案 0 :(得分:49)

案例是逻辑标签。许多人将标签放在与它们所处的块相同的缩进级别。在我看来,通过文本阅读更容易。

我将它与您可以滚动的时间轴进行比较。您在时间线上有标记,而不是缩进内容。然后,您可以快速指出标签/标记的位置,而无需将视线远离基线。

答案 1 :(得分:25)

4个字:没有块,没有缩进

案件没有打开一个街区。在C或C ++中,您甚至可以在switch块的开头放置变量声明(但不会调用初始值设定项,静态变量除外,这是一个陷阱)。您可以使用switch执行许多奇怪的操作,例如Duff's device

因此,由于案例只是标签,缩进它们似乎并不直观,而且缩进也不是大多数样式所选择的样式。

答案 2 :(得分:10)

1999年正式的Oracle Code Conventions for the Java TM Programming Language(第7.8节)推荐了一种开关样式,其中case语句不是相对于switch语句整体缩进的。

这是一个主观的选择,但Sun决定如果每个人都坚持使用一种风格会更好,并选择了这种风格。

答案 3 :(得分:5)

有不同的缩进样式可供选择。 AFAIK,没有被认为比其他人更好的风格,只要你一直使用缩进风格。对我来说,缩进case标签更具可读性,同样适用于类中的privateprotectedpublic标签,但是,我的IDE不会按照我的方式进行缩进。我的代码不像我想的那样可读。哦,好吧......

答案 4 :(得分:4)

也许是为了保持与if语句中表达的逻辑等价物相同的缩进级别?那就是:

switch(i){
case 0:
  //do something 1
case 1:
  //do something 2
}

看起来与其逻辑等价物相似:

if(i==0){
  //do something 1
}else if(i==1){
  //do something 2
}

答案 5 :(得分:0)

FWIW,另一个选择是使用两个半缩进:

switch (i) {
  case 1:
    ...
  case n:
    ...
}