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

fas*_*seg 68 c java syntax

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

没有"case"关键字的缩进似乎是关于每个IDE的默认格式化选项:

switch (i){
case 0:
    break;
case 1:
    break;
}
Run Code Online (Sandbox Code Playgroud)

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

switch (i){
    case 0:
        break;
    case 1:
        break;
}
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*itb 50

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

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

  • 换句话说,`switch`块的内容从`switch`本身缩进一级,但`case`是从它们混入的代码中"缩进"一级. (10认同)
  • `case` 部分就像标签一样,因为执行流程将通过标签从上面的代码继续到下面的代码,而没有 `break`。我仍然更喜欢看到它们缩进。没有缩进,在我看来,它隐藏了 `switch` 语句本身,使人们很难看到事情的开始。但这只是一个真正的问题,因为案例太多,而这完全是“另一个问题”。 (3认同)
  • 如果您也有“case”大括号怎么办?您最终会在不同的行上以相同的缩进级别得到 2 个右大括号。 (2认同)

kri*_*iss 25

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

案件没有打开一个街区.在C或C++中,您甚至可以在switch块的开头放置变量声明(但不会调用初始值设定项,静态变量除外,这是一个陷阱).switchDuff的设备一样,你可以做很多奇怪的事情.

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

  • 我不认为该规则描述了有问题的风格.`switch`确实引入了一个块,而`case`则没有.然而`case`似乎引入了新的缩进级别,而`switch`则没有. (26认同)

Joh*_*ski 10

1999年Java TM编程语言的官方Oracle 代码约定(第7.8节)推荐了一种开关样式,其中case语句不是相对于switch语句整体缩进的.

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


min*_*gos 6

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

  • 同样对我来说,我真的很讨厌没有缩进的案例,已经编程了20多年,但我也可以买它是一个主观的问题...... (3认同)

rod*_*ion 5

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

switch(i){
case 0:
  //do something 1
case 1:
  //do something 2
}
Run Code Online (Sandbox Code Playgroud)

看起来类似于它的逻辑等价物:

if(i==0){
  //do something 1
}else if(i==1){
  //do something 2
}
Run Code Online (Sandbox Code Playgroud)

  • 可能不是——如果可能的话,switch/case 通常由跳转表实现,而不是 if/else 蛇。 (2认同)