使用不带花括号的if语句是一种不好的做法吗? [关闭]

问题描述 投票:117回答:15

我看过这样的代码:

if(statement)
    do this;
else
    do this;

但是,我认为这更具可读性:

if(statement){
    do this;
}else{
    do this;
}

由于这两种方法都起作用,这仅仅是使用偏好还是会推荐一种方法而不是另一种方法?

if-statement coding-style curly-braces
15个回答
198
投票

第一个版本的问题是,如果您回过头来向if或else子句添加第二条语句而又不记得添加花括号,那么您的代码将以意想不到的有趣方式中断。

在可维护性方面,使用第二种形式总是更为明智。

编辑:内德在评论中指出了这一点,但我认为也值得链接到这里。这不仅是一些象牙塔的废话:https://www.imperialviolet.org/2014/02/22/applebug.html


2
投票

这是优先事项。我个人使用这两种样式,如果我有把握地确定不再需要添加其他语句,则使用第一种样式,但如果可能,则使用第二种样式。由于您无法再向第一种样式添加语句,因此我听说有人建议不要使用它。但是,第二种方法确实会导致额外的一行代码,并且如果您(或您的项目)使用这种编码方式,则对于简单的if语句,第一种方法非常可取:


1
投票

我一直试图使我的代码标准,并看起来尽可能地接近。这使得其他人在负责更新它时更容易阅读它。如果您执行第一个示例并在中间添加一行,它将失败。


1
投票

我个人使用第一种样式只是抛出异常或过早地从方法返回。就像在函数开始时使用参数Checking一样,因为在这种情况下,很少要做一件事,而且再也没有别的事情了。


1
投票

我个人偏爱将空格和方括号混合使用,如下所示:


0
投票

我同意大多数答案,因为最好在代码中明确使用大括号。我个人将采用一套编码标准,并确保团队中的每个人都知道并遵守。在我工作的地方,我们使用IDesign.net发布的.NET项目编码标准。


0
投票

我更喜欢大括号。但有时,三元运算符会有所帮助。


98
投票

忽略语句块的一个问题是else-歧义。那就是受C语言启发的语言会忽略缩进,因此无法将其分开:

if(one)
    if(two)
        foo();
    else
        bar();

来自此:

if(one)
    if(two)
        foo();
else
    bar();

33
投票

我的一般模式是,如果它适合一行,我会做:

if(true) do_something();

[如果有一个else子句,或者如果我想在true上执行的代码长度很大,请一直将其括起来:

if(true) {
    do_something_and_pass_arguments_to_it(argument1, argument2, argument3);
}

if(false) {
    do_something();
} else {
    do_something_else();
}

最终,它归结为样式和可读性的主观问题。但是,一般的编程世界几乎分为两方(对于使用花括号的语言):要么一直无休止地使用它们,要么始终无休止地使用它们。我属于后者。


10
投票

我正在使用所使用的IDE的代码格式化程序。可能有所不同,但是可以在“首选项/选项”中进行设置。

我喜欢这个:

if (statement)
{
    // comment to denote in words the case
    do this;
    // keep this block simple, if more than 10-15 lines needed, I add a function for it
}
else
{
    do this;
}

8
投票

从一开始就拥有大括号应有助于防止您不得不调试此:

if (statement)
     do this;
else
     do this;
     do that;

7
投票

我遵循的“规则”是这样:

如果“ if”语句正在测试以便执行某些操作(即调用函数,配置变量等),请使用花括号。

if($test)
{
    doSomething();
}

这是因为我觉得您需要弄清楚在什么条件下正在调用什么函数以及程序的流向何方。让程序员确切地了解在这种情况下调用了哪些函数以及设置了哪些变量,对于帮助他们确切地了解您的程序在做什么很重要。

如果“ if”语句正在测试以停止执行某项操作(即循环或函数中的流控制),请使用单行。

if($test) continue;
if($test) break;
if($test) return;

在这种情况下,对于程序员来说重要的是迅速发现哪些异常情况是您不希望代码运行的,而所有这些情况都包含在$ test中,而不是在执行块中。


6
投票

对于所有if语句甚至最简单的语句都使用大括号。或者,重写一个简单的if语句以使用三元运算符:

if (someFlag) {
 someVar= 'someVal1';
} else {
 someVar= 'someVal2';
}

看起来更像这样:

someVar= someFlag ? 'someVal1' : 'someVal2';

但是如果您完全确定if / else块中没有其他东西,请仅使用三元运算符!


4
投票

我更喜欢使用大括号。添加大括号使其更易于阅读和修改。

这里有一些使用花括号的链接:

根据我的经验,第一种形式的唯一(非常)微小的优势是代码可读性,第二种形式增加了“噪音”。

但是我强烈建议您使用第二种形式的现代IDE和代码自动生成(或自动完成)功能,您不必花很多时间输入花括号,并且可以避免一些最常见的错误。

有足够的耗能虫子,人们只是不应该浪费大量时间而开门。

编写代码时要记住的最重要的规则之一是一致性。无论是谁编写的,每一行代码都应以相同的方式编写。严格防止错误“发生”;)

这与清楚明确地命名变量,方法,文件或正确缩进它们相同...

[当我的学生接受这一事实时,他们不再与自己的源代码作斗争,他们开始将编码视为一种非常有趣,刺激性和创造性的活动。他们挑战自己的思想,而不是他们的神经!

这是优先事项。我个人使用这两种样式,如果我有把握地确定不再需要添加其他语句,则使用第一种样式,但如果可能,则使用第二种样式。由于您无法再向第一种样式添加语句,因此我听说有人建议不要使用它。但是,第二种方法确实会导致额外的一行代码,并且如果您(或您的项目)使用这种编码方式,则对于简单的if语句,第一种方法非常可取:

if(statement)
{
    do this;
}
else
{
    do this;
}

但是,我认为解决此问题的最佳方法是使用Python。使用基于空格的块结构,您没有两种不同的方法来创建if语句:只有一种方法:

if statement:
    do this
else:
    do this

虽然确实具有您根本无法使用花括号的“问题”,但您确实获得了好处,即第一种样式不再是行,并且可以添加更多语句。

我一直试图使我的代码标准,并看起来尽可能地接近。这使得其他人在负责更新它时更容易阅读它。如果您执行第一个示例并在中间添加一行,它将失败。

无法使用:

if(statement)做这个;还有这个;其他做这个;

我个人使用第一种样式只是抛出异常或过早地从方法返回。就像在函数开始时使用参数Checking一样,因为在这种情况下,很少要做一件事,而且再也没有别的事情了。

示例:

if (argument == null)
    throw new ArgumentNullException("argument");

if (argument < 0)
    return false;

否则,我使用第二种样式。

我个人偏爱将空格和方括号混合使用,如下所示:

if( statement ) {

    // let's do this

} else {

    // well that sucks

}

[我认为这看起来很干净,并且使我的代码非常易于阅读,最重要的是-调试。

我同意大多数答案,因为最好在代码中明确使用大括号。我个人将采用一套编码标准,并确保团队中的每个人都知道并遵守。在我工作的地方,我们使用IDesign.net发布的.NET项目编码标准。

我更喜欢大括号。但有时,三元运算符会有所帮助。

代替:

int x = 0;
if (condition) {
    x = 30;
} else {
    x = 10;
}

一个人应该做:int x = condition ? 30 : 20;

也想象一个案例:

if (condition)
    x = 30;
else if (condition1)
    x = 10;
else if (condition2)
    x = 20;

如果放上花括号,会更好。


2
投票

根据我的经验,第一种形式的唯一(非常)微小的优势是代码可读性,第二种形式增加了“噪音”。

© www.soinside.com 2019 - 2024. All rights reserved.