格式化if语句

时间:2008-09-18 22:08:16

标签: c if-statement

这不是一场神圣的战争,这不是“哪个更好”的问题。

如果是块,则使用以下格式的单一语句有什么优点。

if (x) print "x is true";

if(x) 
    print "x is true";

相反
if (x) { print "x is true"; }
if(x) {
    print "x is true";    
}

如果你格式化你的单一陈述ifs没有括号或者知道一个程序员这样做,是什么导致你/他们首先采用这种风格?我对这给你带来的好处特别感兴趣。

更新:由于最受欢迎的答案忽略了实际问题(即使它提供了最合理的建议),这里是无支架专业人士的综述。

  1. 对某些人来说更具可读性
  2. Brackets调用范围,在某些情况下具有理论开销

42 个答案:

答案 0 :(得分:48)

我非常不喜欢任何将if的测试和正文放在同一行上的风格。

这是因为共享该行使得在许多调试器中无法在if的主体上设置断点,因为断点通常是基于行号的。

答案 1 :(得分:48)

我发现了这个:

if( true ) {
    DoSomething();
} else {
    DoSomethingElse();
}

比这更好:

if( true )
    DoSomething();
else
    DoSomethingElse();

这样,如果我(或其他人)稍后回到此代码以向其中一个分支添加更多代码,我将不必担心忘记将代码包围在大括号中。我们的眼睛会在视觉上看到缩进作为我们想要做的事情的线索,但大多数语言都没有。

答案 2 :(得分:33)

总是使用大括号是一个好主意,但标准答案总是给出“如果有人添加一行代码并忘记添加大括号会怎么样?”是一个相当弱的原因。

有一个微妙的错误,可以从一开始就没有括号引入。它发生在我身上几次,我发现它发生在其他程序员身上。

用一个简单的if语句开始,天真无邪。

if (condition)
    do_something();
else
    do_something_else();

哪一切都很好。

然后有人出现并为if添加了另一个条件。他们无法使用&&和到if语句本身,因为逻辑是不正确的,所以他们添加另一个if。我们现在有:

if (condition)
    if (condition2)
        do_something();
else
    do_something_else();

你看到了问题吗?它可能看起来正确,但编译器看到的方式不同。它看起来像这样:

if (condition)
    if (condition2)
        do_something();
    else
        do_something_else();

这意味着完全不同的东西。编译器不关心格式化。其他与最近的if一起去。另一方面,人类依赖于格式化,很容易错过这个问题。

答案 3 :(得分:21)

我总是使用

if(x) 
{
    print "x is true";    
}
如果他们在当前行之后添加一行,那么忽略大括号可能会导致有人错误地认为他们正在添加if子句。

答案 4 :(得分:14)

我用左

if (x)
{
    DoSomething();
}

多行,但我更喜欢无支架的一个衬里:

if (x)
   DoSomething();
else
   DoSomethingElse();

我觉得无关的括号在视觉上令人反感,我从未做过 添加另一个语句时,上述错误之一不添加括号。

答案 5 :(得分:7)

if
{
// code
}
else 
{
// else code
}

因为我喜欢代码块排队(包括它们的大括号)。

答案 6 :(得分:7)

如果我编码:

if(x) 
    print "x is true";

并且6个月后需要添加一个新行,花括号的存在使我输入的可能性大大降低

if(x) 
    print "x is true";
    print "x is still true";

会导致逻辑错误,而不是:

if(x) { 
    print "x is true";
    print "x is still true";
}

如此花括号使得这些逻辑错误更易于阅读和避免,我发现。

答案 7 :(得分:7)

像Matt(上面3),我更喜欢:

if (x)
{
    ...statement1
    ...statement2
}

if (x)
    ...statement
else
    ...statement

我觉得很奇怪,有人可能会稍后出现并且没有意识到他们必须添加大括号以形成多行if块。如果这超出了他们的能力,我想知道其他的东西是什么!

答案 8 :(得分:5)

如果块缺少大括号,则单个语句:

优点:

  • 更少的字符
  • 清洁外观

缺点:

  • 均匀性:并非所有块看起来都相同
  • 向块添加语句时可能存在错误:用户可能忘记添加大括号,而新语句将不会被if覆盖。
  

如:

if(x) 
    print "x is true";
    print "something else";

答案 9 :(得分:5)

当我在函数开头测试中断条件时,我只倾向于单行,因为我希望保持这段代码尽可能简单和整洁

public void MyFunction(object param)
{
     if (param == null) return;

     ...
}

另外,如果我发现我确实想要避免使用大括号并内联if子句代码,我可以对它们进行单行处理,这样任何人都可以添加新行,如果需要添加括号那么显而易见

答案 10 :(得分:4)

Joel Spolsky写了一篇好文章:Making Wrong Code Look Wrong

他专门解决了这个问题......

if (i != 0)  
    foo(i);
     

在这种情况下,代码是100%正确的;   它符合大多数编码约定   它并没有错,但是   单一陈述的事实   if语句的主体不是   用括号括起来可能会烦扰你,   因为你可能在思考   某人,你的脑袋,天哪   可能会插入另一行代码   有

if (i != 0)
    bar(i);
    foo(i);
     

...忘了添加大括号,和   因而不小心制造   FOO(I)无条件的!所以当你看到   不在括号中的代码块,   你可能只觉得一个小小的,小的,   制作的不洁的汤   你不安。

他建议你......

  

...故意设计您的代码   以这种方式,你的鼻子   不洁使你的代码更多   可能是正确的。

答案 11 :(得分:4)

我用

if (cond) {
  ...
} else {
  ...
}
  • 一切都应该有牙套。即使现在我在if块中只有一行,我后来添加了更多。
  • 我没有把括号放在自己的线上,因为这是毫无意义的浪费空间。
  • 我很少把这个块放在与可读性条件相同的行上。

答案 12 :(得分:4)

我不喜欢在不需要时使用牙箍。我觉得它会使方法中的行数膨胀并使其无法读取。所以我几乎总是采取以下措施:

if (x)
   print "x is true"
for (int i=0; i<10; i++)
   print "y is true"

等等。如果有人需要添加另一个语句,那么他可以添加大括号。即使你没有R#或类似的东西,这也是一个非常小的交易。

尽管如此,在某些情况下我会使用大括号,即使语句中只有一行,也就是说,如果该行特别长,或者我需要在'if'中注释。基本上,我只是使用看起来更好看的东西来看待。

答案 13 :(得分:3)

if (x) {
    print "x is true";    
}
else {
    do something else;
}

我总是打字。这只是一个好习惯。与思考相比,打字不是“工作”。

注意条件之前的空格。这有助于它看起来不像方法调用。

答案 14 :(得分:3)

说真的,当你最后一次在任何代码中出现错误的时候是因为有人犯了错误:

if (a)
  foo();
  bar();

是的,永远不会...... *这里唯一真正的“专业人士”就是要与周围代码的风格相匹配,并将美学斗争留给刚走出大学的孩子们。

*(警告当foo(); bar();是一个宏扩展,但这是一个问题w /宏,而不是花括号w / ifs。)

答案 15 :(得分:3)

其他方式是写:

(a==b) ? printf("yup true") : printf("nop false");

如果您想存储一个比较简单条件的值,这将是实用的,如下所示:

int x = (a==b) ? printf("yup true") : printf("nop false");

答案 16 :(得分:3)

空白是你的朋友......

但是,再说一遍,我喜欢:

if (foo)
{
    Console.WriteLine("Foobar");
}

答案 17 :(得分:2)

关于唯一一次接受no-bracing似乎是在方法开始时参数检查变量的时候:

public int IndexOf(string haystack, string needle)
{
    // check parameters.
    if (haystack == null)
        throw new ArgumentNullException("haystack");
    if (string.IsNullOrEmpty(needle))
        return -1;

    // rest of method here ...

唯一的好处是紧凑性。当程序员非常明显地说:

时,程序员不必趟过不必要的{}。
  • 该方法退出任何真正的分支
  • 很明显这些都是1-liners

那就是说,出于其他人所说的理由,我总是{}用于程序逻辑。当你放下牙箍时,它很容易在不存在的情况下进行精神支撑并引入微妙的代码缺陷。

答案 18 :(得分:2)

if (x)
{
    print "x is true";
}

在同一列中打开和关闭支架,可以轻松找到不匹配的支架,并在视觉上隔离块。在与“if”相同的列中打开大括号可以很容易地看到该块是条件的一部分。由包含大括号的行创建的块周围的额外空白区域使得在浏览代码时可以轻松地从逻辑结构中选择它。总是明确地使用大括号有助于避免人们稍后编辑代码时出现问题并误读哪些语句是条件的一部分而哪些不是 - 缩进可能与现实不匹配,但总是用括号括起来。

答案 19 :(得分:2)

被杀害的人我真的不是一个教条式的规则。在某些情况下,如果它没有超过某个宽度,我实际上更喜欢紧凑性,例如:

if(x > y)      { xIsGreaterThanY(); }
else if(y > x) { yIsGreaterThanX; }
else           { xEqualsY(); }

这比我更容易理解:

if( x > y ){
    xIsGreaterThanY(); 
}else if( x < y){
    yIsGreaterThanX();
}else{
    xEqualsY();
}

这有一个额外的好处,鼓励人们将逻辑抽象为方法(就像我已经完成的那样),而不是将更多的逻辑集中到嵌套的if-else块中。它还占用三行而不是七行,这可能使得不必滚动以查看多个方法或其他代码。

答案 20 :(得分:1)

我更喜欢括号内的样式,主要是因为它给眼睛一个明确的开始和停止点。它可以更容易地查看语句中实际包含的内容,并且它实际上是一个if语句。也许是一件小事,但这就是我使用它的原因。

答案 21 :(得分:1)

我不喜欢使用以下关键字在同一行上关闭大括号:

if (x) {
    print "x is true";    
} else {
    do something else;
}

这使得删除/注释掉else子句变得更加困难。通过将follow关键字放在下一行,我可以利用编辑器,让我选择一系列行,并一次注释/取消注释。

if (x) {
    print "x is true";    
}
//else {
//    do something else;
//}

答案 22 :(得分:1)

我总是喜欢这个:

if (x) doSomething();

if (x) {
    doSomthing();
    doOtherthing();
}

但总是依赖于语言和你正在做的行动。有时我喜欢戴牙箍,有时候不喜欢。依赖于代码,但我编写的代码必须写一次,重写十次,读一百次;所以,就像你想要的那样,想要更快地阅读和理解

答案 23 :(得分:1)

/* I type one liners with brackets like this */
if(0){return(0);}
/* If else blocks like this */
if(0){
    return(0);
}else{
    return(-1);
}

我从不在标签之外使用多余的空格,但总是包括括号可以节省大量时间。

答案 24 :(得分:1)

如果它是if的一行(以及可选的其他一行),我宁愿不使用括号。它更具可读性和简洁性。我说我更喜欢它,因为它纯粹是一个偏好的问题。虽然我认为试图强制执行必须始终使用大括号的标准是有点傻。

如果你不得不担心有人在if语句的主体上添加另一行而不添加(只有当时需要的)大括号,我认为你有比亚拜占庭编码标准更大的问题。

答案 25 :(得分:1)

只要你在你工作的团队中保持一致,那就没那么重要了

每个人都这样做是主要的事情

答案 26 :(得分:1)

包含你的单行if语句具有相当明智的优势,可以保护你免受头痛,如果在某个之后,你(或其他编码人员维护或改变你的代码)需要在条件的某些部分添加语句块。

答案 27 :(得分:1)

无论如何,这就是我的方式!它看起来最好。

If(x)
{
    print "Hello World !!"
}
Else
{
    print "Good bye!!"
}

答案 28 :(得分:1)

如果您对各种代码格式样式的名称感到好奇,Wikipedia上有一篇关于Indent Styles的文章。

答案 29 :(得分:1)

如果您这样做:

if(x)
{
    somecode;
}
else
{
    morecode;
}

这对于源代码控制和预处理程序指令更有效 关于生活很长时间的代码。没有#if左右添加更容易 无意中违反了声明或不得不添加额外的行。

习惯这有点奇怪,但经过一段时间后效果很好 而

答案 30 :(得分:0)

我相信这是最重要的原因, 而且我很震惊地看到它还没有得到答案 (虽然在a comment中提到过, an answer中的脚注,以及an answer中的旁边。

您应该始终使用括号,因为

if (x)
   DoSomething();
如果DoSomething随后被重新定义为多语句宏,则

中断:

#define DoSomething()          statement1 ;  statement2 ;

当然,we all know表示正确的事情 是这样定义宏:

#define DoSomething()    do {  statement1 ;  statement2 ;  } while (0)
这使宏的行为更像是一个语句。

那就是说,我承认我不遵循自己的建议; 当我(似乎是)单个陈述时,我通常不使用大括号。 (羞愧地说道。)

答案 31 :(得分:0)

对我来说,大括号可以更容易地看到程序的流程。它还可以更容易地将语句添加到if语句的主体。如果没有大括号,则必须添加大括号以添加另一个语句。

我想不使用牙箍的优点是它看起来更清洁,你不会浪费一条带有右括号的线。

答案 32 :(得分:0)

一个衬里只是......一个衬里,应该保持这样:

if (param == null || parameterDoesNotValidateForMethod) throw new InvalidArgumentExeption("Parameter null or invalid");

我喜欢这种风格的参数检查,例如,它很紧凑,通常很容易阅读。我曾经一直使用缩进代码来添加大括号,但发现在许多琐碎的情况下,它只是浪费了显示器上的空间。在某些情况下放下牙箍使我能够更快地进入方法,并使整体呈现更容易在眼睛上。然而,如果它涉及更多,那么我就像其他一切一样对待它,我全力以赴如此:

if (something)
{
    for(blablabla)
    {
    }
}else if
{
 //one liner or bunch of other code all get the braces
}else
{
  //... well you get the point
}

这就是说......我在同一条线上鄙视大括号:

if(someCondition) { doSimpleStuff; }

最差

if(somethingElse){
  //then do something
}

它更紧凑,但我发现跟踪大括号更难。

总的来说,只要一个人没有采用一些非常奇怪的缩进和支撑方式,这个问题就更具个人品味了......

    if(someStuff)
        {
  //do something
        }

答案 33 :(得分:0)

我想我更像是一个超出我想象的异常值;我还没有注意到这个。

我是

的粉丝
if (x)
{ foo(); }

感觉紧凑&amp;可读(我讨厌庞大的大括号),但它使条件的范围明确。

它比单线if的断点更友好。在我的直线换面世界里,它也有更多的感觉:

if (x)
{ foo(); }
else
{
   bar();
   baz();
}

修改:看来我误读了原来的问题,所以这个答案不在话题。不过,我仍然对任何回应感到好奇。

答案 34 :(得分:0)

我更喜欢以下......我觉得它看起来更干净。

if(x)
{
    code;
}
else
{
     other code;
}

答案 35 :(得分:0)

我还没有看到有人提到将括号放在与emacs中if-bracket匹配相同的行上的最有用的理由。将光标放在结束括号上时,emacs会显示具有匹配开始括号的行。将起始括号放在自己的行上,否定了该功能。

答案 36 :(得分:0)

我更喜欢带括号的单行语句,我知道当我插入新的代码行时,我可能会忘记添加它们,但我不记得上次发生这种情况。我的编辑(vim)阻止我写这样的东西:


if (x)
    x = x + 1;
    printf("%d\n", x);

因为它会以不同的方式缩进。我遇到的唯一问题是糟糕的书面宏:


#define FREE(ptr) {free(ptr); ptr = NULL;}

if (x)
    FREE(x);
else
    ...

这当然不起作用,但我认为最好修复宏,以避免那些可能的错误或问题,而不是改变格式化风格。

因此,这种形成方式可能存在问题,但它们并不是致命的。它最终会成为一种品味。

答案 37 :(得分:0)

在提供的选项中,我会选择

if (x) {
  print "x is true";    
}

只是因为大括号习惯打字。

但实际上,作为一个主要是Perl的程序员,我更有可能使用

print "x is true" if x;

(当我使用不支持后缀条件的语言时,这总是让我兴奋。)

答案 38 :(得分:0)

此类型的任何格式都可以。人们会在此与你争论黑色和蓝色,因为它易于理解。人们喜欢谈论他们理解的事情而不是处理更大的问题,例如良好的设计和解决新算法的难题。对于简单的单行,我倾向于不使用括号。但是,我也很高兴用括号阅读它。如果给定项目有特定的样式指南,我更愿意遵循它。我相信一些主观的正确理想的一致性。

我个人选择不使用单行括号是因为键入较少的字符,较短的代码和简洁。

答案 39 :(得分:0)

到目前为止,我觉得自己已经投了赞成票,但我会保证其中一个:

if (expr) {
   funcA();
}
else {
   funcB();
}

或者,在有限的情况下的简写为可读性:

if (expr) funcA();
else funcB();

对我来说,当你希望它像英语语法一样阅读时,速记格式很好。如果代码看起来不够可读,我会突破界限:

if (expr)
   funcA();
else
   funcB();

仔细考虑后,我不会在if / else块中放置嵌套条件,以避免编码器/编译器模糊。如果它比这更复杂,我会在ifelse块上使用大括号。

答案 40 :(得分:0)

行间距和缩进可以做很多事情以便于阅读。

就可读性而言,我更喜欢以下内容:

// Do this if you only have one line of code
// executing within the if statement
if (x)
    print "x is true";

// Do this when you have multiple lines of code
// getting executed within the if statement    
if (x)
{
    print "x is true";
}

答案 41 :(得分:0)

我希望IDE能够强制执行此行为。正如你正确指出的那样,没有“正确”的行为。一致性更重要......它可以是风格。