使用没有花括号的if语句是不好的做法吗?

时间:2010-01-23 22:59:27

标签: if-statement coding-style curly-braces

我见过这样的代码:

if(statement)
    do this;
else
    do this;

我不喜欢这样,我认为这更清晰,更具可读性

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

这只是一个偏好问题,还是会推荐一种方式?

15 个答案:

答案 0 :(得分:181)

第一个版本的问题是,如果你回过头来向if或else子句添加第二个语句而不记得添加大括号,你的代码将会以意想不到的方式破解。

可维护性,使用第二种形式总是更聪明。

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

答案 1 :(得分:88)

遗漏语句块的一个问题是其他模糊性。这是C语言的语言忽略缩进,因此无法将其分开:

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

由此:

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

答案 2 :(得分:32)

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

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();
}

归根结底,它归结为风格和可读性的主观问题。然而,一般的编程世界几乎分为两个派对(对于使用大括号的语言):要么一直使用它们而没有异常,要么一直使用它们,例外。我是后一组的一部分。

答案 3 :(得分: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;
}

答案 4 :(得分:8)

从第一时开始正确使用大括号应该有助于防止您不得不调试它:

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

答案 5 :(得分:6)

我遵循的“规则”是:

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

if($test)
{
    doSomething();
}

这是因为我觉得你需要明确在什么条件下调用哪些函数以及程序流程在哪里。让程序员准确理解调用哪些函数以及在这种情况下设置哪些变量对于帮助他们准确理解您的程序正在做什么非常重要。

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

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

在这种情况下,对程序员来说重要的是快速发现你不希望代码运行的特殊情况,这些都是在$ test中,而不是在执行块中。

答案 6 :(得分:4)

对所有if语句使用大括号,即使是简单语句也是如此。或者,重写一个简单的if语句以使用三元运算符:

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

看起来好多了:

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

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

答案 7 :(得分:4)

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

以下是使用大括号的一些链接:

答案 8 :(得分:2)

这是一个偏好的问题。我个人使用这两种风格,如果我有理由确定我不再需要添加语句,我会使用第一种风格,但如果可以的话,我会使用第二种风格。由于你不能再添加第一种风格的语句,我听到有些人建议不要使用它。但是,第二种方法会产生额外的代码行,如果您(或您的项目)使用这种编码样式,则第一种方法非常适用于简单的if语句:

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

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

if statement:
    do this
else:
    do this

虽然确实存在根本无法使用大括号的“问题”,但您确实获得的好处是它不再是第一种样式的行,并且它有能力添加更多语句。

答案 9 :(得分:1)

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

无效:

如果(语句)     做这个;     还有这个; 其他     这样做;

答案 10 :(得分:1)

我个人使用第一种样式只抛出异常或过早地从方法返回。就像参数在函数开头检查一样,因为在这些情况下,我很少有多个事情要做,而且从来没有其他事情。

示例:

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

if (argument < 0)
    return false;

否则我使用第二种风格。

答案 11 :(得分:1)

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

但是现代IDE和代码自动生成(或自动完成)我强烈建议使用第二种形式,你不会花费额外的时间来输入花括号,你会避免一些最常见的错误。

有足够的能量消耗错误,人们只是不会为大量浪费时间打开大门。

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

这与明确命名相同。明确你的变量,方法,文件或正确缩进它们......

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

答案 12 :(得分:1)

我个人喜欢使用空格和括号的混合:

if( statement ) {

    // let's do this

} else {

    // well that sucks

}

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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

代替:

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;

如果你把大括号放进去会好得多。