K&R和One True Brace Style(1TBS)样式有什么区别?


48

我已经阅读了有关缩进样式Wikipedia文章,但我仍然不明白。K&R和1TBS有什么区别?


我在某处读到K&R的样式受空间考虑因素支配-即,减少代码在书中占用的垂直空间。
克里斯·

@ChrisF还可以减少屏幕上的垂直空间。当我们有80列x 25线终端时,这是值得的!
马丁·贝克特

7
苹果的“ goto失败”是一个严重错误的一个很好的例子,使用1TBS可以避免该错误:imperialviolet.org/2014/02/22/applebug.html

4
通过将语句放在一行上,进行校对,使用无效代码检查器或使用对缩进敏感的语言,也可以防止Apple的错误。
Cees Timmerman

1
@CeesTimmerman,..或正在测试...
thoni56 '18

Answers:


76

K&R和一个真正的布雷斯风格(1TBS)之间最大的区别是,在1TBS,所有ifelsewhilefor语句有开闭括号,即使他们是没有必要的。目的是使插入新语句变得容易,并确切知道如何将它们分组。

举个例子:

K&R:

int i;
for (i = 0; i < 10; i++)
  printf("Hi.");

1TBS:

int i;
for (i = 0; i < 10; i++) {
  printf("Hi");
}

20

K&R是这样的:

if (x) 
    a();
else {
    b();
    c();
}

也就是说:大括号仅在需要的地方使用,在与控制语句相同的行上打开大括号,在自己的行上关闭大括号。

“一个真正的花括号样式”(1TBS或OTBS)通过将一个受控语句括在花括号中而将其变成复合语句:

if (x) {
    a();
} else {
    b();
    c();
}

Allman样式比1TBS稍远一些,并且通过将开口撑杆本身也放置在一条线上来强制垂直间距:

if (x) 
{
    a();
}
else 
{
    b();
    c();
}

编辑:

我仍在尝试确切地说出“丹尼斯·里奇(Dennis Ritchie)是一个非常聪明的人,他不仅发明了一种好的语言,而且还发明了一种非常好的支撑风格”,这完全符合“傲慢”的意思。

对于那些坚持认为它仍然是自大的人来说,这是一个小挑战:前往Sourceforge,Github等),并使用K&R花括号样式挑选项目。通过他们的错误和犯的记录去,并试图找到一个单一的,是由他们使用支具风格造成的错误。

如果您不想做那么多工作,请尝试进行简单的统计分析。比较使用不同花括号样式的项目,并查看是否可以显示“双峰”(bimodality),这是与括号样式相关的错误计数(严重性等)的统计上显着差异。

几年前,我都做过这两种事情,但是找不到一个可以归因于支撑样式的错误,也找不到任何在两者之间具有统计学上显着相关性的东西。平均而言,那些使用K&R支撑有小幅更少的错误,但差异太大太小,有资格作为统计显著。

自从它被提出以来,我将使用多语句宏评论这种情况。包含多个语句但不使用大括号括起来的宏存在一个错误。我的工作不是编写掩盖该错误的代码。恰恰相反,我的工作是尽快找到并消除该错误。

编写代码以期掩盖错误,以使它们无法得到诊断和修复,这是彻头彻尾的邪恶。如果愿意,可以称呼那个傲慢的人,但我认为这几乎没有商量的余地。应该找到并修复错误,而不要掩盖。存在的时间越长,修复它们的可能性就越大,难度也就越大。


1
删除所有引起争吵和吵杂的评论。如果您有有效的观点,请将其发布为答案。如果您想讨论,请聊天
ChrisF

8
1tbs不会将}和其他字符放在一行上吗?保留垂直空间同时保留奇妙的美丽对称性是重点!
马丁·贝克特

4
@杰里-好吧,任何一场圣战都需要进行一些分裂;-)
马丁·贝克特

6
失败 失败
2014年

9
是的,可以跟进@JamiePate的评论,这是Apple SSL错误,在此进行了分析if后面有一个带有缩进语句的语句,因此看起来它们都是有条件执行的。但是没有括号!第二条语句确实超出了,if并且将始终执行,因此是bug。
科林·D·贝内特

9

通常,KR大括号样式的问题在于代码重构。在四处移动代码时,很容易会漏掉一些括号,错误地移动它(或移动它下面的东西,以为它是有条件执行的),然后在某些东西不再起作用时挠头,或者不幸地陷入困境。一个未经良好测试的代码区域,直到黑帽找到利用它的方法,该错误才被注意到。如果您发现问题,则快速进入调试器很容易找到问题,但是如果没有发现...


2
这似乎只是重复先前的答案中提出和解释的观点
gnat 2015年

1
我认为其他答案并不能完全解释问题在日常代码中是如何产生的。他们解释了什么是OTB,但没有解释为什么它真正重要。评论可能会解决这个问题,但不能解决问题。
贾斯汀·斯旺哈特
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.