为什么在switch语句上出现奇怪的缩进?


77

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

在几乎每个IDE中,似乎没有缩进“ case”关键字是默认的格式设置选项:

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

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

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

这背后隐藏着一些逻辑吗?


2
直到现在才意识到这一点!这很可能是因为开关是在压痕之前发明的))
rodion 2010年

1
NB默认情况下会缩进切换(这对我来说也更具可读性)
barti_ddu 2010年



1
@gstackoverflow IDEA 15.0.5不适用于我。我希望能做到。我更喜欢缩进来对应于逻辑分组,而开关是一个逻辑元素,通常希望将其效果视为一个单元。因此,我想将其视为一个单元(例如缩进)。我也倾向于在案例部分的语句周围添加括号。
古斯

Answers:


55

这些案例在逻辑上是标签。许多人将标签放置在与其所在的块相同的缩进级别上。我认为,这样可以更轻松地阅读文本。

我将其与可以滚动浏览的时间轴进行比较。时间轴本身上有标记,但没有缩进内容中。然后,您可以快速指出标签/标记的位置,而不必将视线从基线移开。


11
换句话说,该switch块的内容从其switch自身缩进一级,但是cases从与其混合的代码中“缩进”一级。
史蒂夫·杰索普

我对此持反对态度,倾向于缩进,因为我认为它更具可读性。这个答案以及防止过度压痕/包裹的好处改变了我的观点。将案例视为标签,而不是如果条件未缩进则条件是否有助于稍微提高可读性。
Pilot_51 2013年

2
这些case部分的作用类似于标签,因为执行的流程将从上面的代码一直到下面的代码,不带break。我仍然希望看到它们缩进。在我看来,没有缩进,switch语句本身就隐藏了起来,很难看到事物的开始。但是,只有在案件太多的情况下这才是一个真正的问题,而这又是一个整体的“另一个问题”。
Lee Meador

那么默认子句呢?在Eclipse(Java)中,开关的默认大小写会自动缩进,而不是像情况一样“不缩进”。我认为,在默认情况下发生的事情的易读性等于在定义好的情况下对可读性的需求。
Chexxor

1
如果您也有括号case怎么办?您最终将在不同行上的相同压痕级别使用2个右括号。
Iulian Onofrei

28

用4个词表示:无障碍,无缩进

案件没有打开障碍。在C或C ++中,您甚至可以在switch块的开头放置变量声明(但不调用初始化程序,除了静态变量,这是一个陷阱)。你可以做很多奇怪的事情有switch,像达夫设备

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


我不会说它们一定是标签,因为您可以将它们既视为标签又作为if-elses序列的语法糖。虽然,因为它们看起来像标签,所以缩进可能更适合这种方式。
rodion 2010年

28
我认为该规则不能描述所涉及的样式。switch确实引入了一个障碍,case但没有。而且case似乎引入了新的缩进级别,而switch事实并非如此。
史蒂夫·杰索普

1
@rodion:就复杂性而言,C开关的实现为O(1),等效的if-else字符串为O(n)。if-else期望后面紧跟一个语句,不区分大小写,等等。您还可以在C标准中找到对案例的引用作为标签(没有检查确切的引号,但是我很确定自己已经看过)。
克里斯(Kriss)2010年

@Steve:switch本身不会引入一个块。人们通常将它用作引入块的依赖语句。
詹斯·古斯特

1
@kriss:所有自动变量声明都是定义。它们只是没有初始化。将初始化变量定义放在开关的开头没有什么害处,但是初始化将永远不会执行,因此它没有用。当然,静态变量定义在切换开始时仍然有效,无论它们是否已初始化。
R .. GitHub停止帮助ICE,2010年


4

有不同的压痕样式可供选择。AFAIK,只要您始终使用缩进样式,任何一种样式都不会比其他样式更好。对我来说,缩进case标签的可读性,这同样适用于privateprotectedpublic标签类中,但是,我的IDE不会做的缩进我的方式。我的代码不像我希望的那样可读。那好吧...


3
对我来说一样,我真的很讨厌没有缩进的案例,已经编程了20多年了,但是我也可以买到这是一个主观问题……
rupps

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
}

2
可能不是-切换/大小写通常是通过跳转表来实现的,而不是if / else蛇。
约翰·科特林斯基

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.