Java 为什么开关语句上有奇怪的缩进?

Java 为什么开关语句上有奇怪的缩进?,java,c,syntax,Java,C,Syntax,为什么在switch语句中imho缺少“case”关键字的缩进被认为是好的样式 “case”关键字的缩进似乎不是每个IDE中的默认格式选项: switch (i){ case 0: break; case 1: break; } 虽然我觉得这种格式更直观: switch (i){ case 0: break; case 1: break; } 这背后有什么逻辑,我想不通吗?1999年的官方Oracle(第7.8节)建议使用切换样

为什么在switch语句中imho缺少“case”关键字的缩进被认为是好的样式

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

switch (i){
case 0:
    break;
case 1:
    break;
}
虽然我觉得这种格式更直观:

switch (i){
    case 0:
        break;
    case 1:
        break;
}
这背后有什么逻辑,我想不通吗?

1999年的官方Oracle(第7.8节)建议使用切换样式,其中case语句相对于switch语句整体不缩进


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

这些案例是合乎逻辑的标签。许多人将标签放置在与其所在块相同的缩进级别。在我看来,这样更容易通读课文


我将其与您可以滚动浏览的时间线进行比较。您在时间线本身上有标记,而不是缩进到内容中。然后,您可以快速指出标签/标记的位置,而无需将眼睛从基线移开

有不同的缩进样式可供选择。顺便说一句,只要您始终使用缩进样式,就没有比其他样式更好的样式了。对我来说,缩进
case
标签更具可读性,类中的
private
protected
public
标签也是如此,但是,我的IDE不会按我的方式缩进。我的代码不像我希望的那样可读。哦,好吧……

如果stations,那么它可能要保持与它在
中表示的逻辑等价物相同的缩进级别?即:

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
}

共4个字:无块,无缩进

案件没有打开一个街区。在C或C++中,甚至可以在变量块的开始处放置变量声明(但是除了静态变量之外,初始化器不被调用,这是陷阱)。使用
开关
可以做很多奇怪的事情,比如


因此,由于案例只是标签,缩进看起来并不直观,大多数样式都选择不缩进的样式。

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

开关(一){
案例1:
...
案例n:
...
}


直到现在才意识到这一点!这可能是因为switch是在缩进之前发明的。)NB默认情况下会缩进switch(对我来说它看起来也更可读)官方文档的可能副本不符合代码约定:@gstackoverflow IDEA 15.0.5它不适合我。但愿如此。我更喜欢缩进来对应逻辑分组,而开关是一个逻辑元素,通常人们认为它是一个单元。因此,我希望将其视为一个单元(例如缩进)。我也倾向于在case部分的语句周围添加大括号。我不会说它们一定是标签,因为您可以将它们视为标签,也可以将它们视为序列
if-else
s的语法糖。尽管如此,因为它们看起来像标签,那么缩进可能更适合这种方式。我不认为这条规则描述了所讨论的样式<代码>开关
会引入块,而
案例
不会引入块。然而,
case
似乎引入了一个新的缩进级别,而
switch
则没有。@rodion:就复杂性而言,C开关实现是O(1),如果else字符串是O(n),则等价。如果else后面只跟一个语句,而不是case,等等。您还可以在C标准中找到case作为标签的引用(没有检查确切的引用,但我很确定我已经看到了)。@Steve:
开关本身并没有引入块。人们通常将块语句用作引入块的依赖语句。@kris:所有自动变量声明都是定义。它们只是没有初始化。将初始化的变量定义放在开关的开头没有坏处,但是初始化永远不会执行,所以它是无用的。当然,静态变量定义在开关开始时是有效的,不管它们是否初始化。换句话说,
switch
块的内容从
switch
本身缩进一级,但是
case
是“向外缩进的”一级代码,我对此持怀疑态度,倾向于缩进,因为我认为缩进更具可读性。这个答案,加上防止过度压痕/包装的好处,改变了我的看法。将案例视为标签,而不是条件在不缩进时似乎对可读性有点帮助。
案例
部分的作用类似于标签,因为执行流程将通过标签从上面的代码继续到下面的代码,而不会出现
中断
。我还是喜欢看到它们缩进。在我看来,如果没有缩进,它就隐藏了
switch
语句本身,很难看到事情的开始。但这只是一个真正的问题,当有太多的情况下,这是一个完整的'另一个问题。那么违约条款呢?在Eclipse(Java)中,开关的默认大小写是自动缩进的,而不是像大小写那样“无缩进”。我认为在默认情况下发生的事情的易读性等于在定义的情况下需要易读性。如果你也有
case
s的大括号呢?最后,在不同的行上有两个相同缩进级别的闭合大括号。可能不是-如果可能,开关/案例通常是通过跳转表实现的,而不是if/else蛇。这可能是mesame对我唯一有意义的解释,我真的很讨厌没有缩进的案例,已经编程20多年了,但我也可以买,这是一个主观问题…嗯。万岁!