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

我见过这样的代码:

if(statement)
do this;
else
do this;

然而,我认为这更具可读性:

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

既然这两种方法都可以工作,那么这仅仅是一个使用哪种方法的偏好问题,还是建议使用一种方法而不是另一种方法?

172992 次浏览

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

行不通:

如果(声明) 这样做; 还有这个 别的 这样做;

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

在可维护性方面,使用第二种形式的 一直都是更聪明。

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

我正在使用我使用的 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;
}

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

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

最终,它归结为一个主观问题的风格和可读性。然而,一般的编程世界几乎可以分为两个部分(对于使用大括号的语言) : 要么无例外地一直使用它们,要么无例外地一直使用它们。我属于后者。

从一开始就使用大括号应该可以帮助你避免调试这个程序:

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

这只是个人喜好的问题。我个人使用两种样式,如果我有理由相信我不需要添加更多的语句,我会使用第一种样式,但如果可能的话,我会使用第二种样式。由于您不能向第一种样式添加更多的语句,因此我听到一些人建议不要使用它。然而,第二种方法确实会产生额外的代码行,如果您(或您的项目)使用这种编码风格,第一种方法对于简单的 if 语句是非常可取的:

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

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

if statement:
do this
else:
do this

虽然这确实存在一个“问题”,那就是你根本不能使用大括号,但是你确实获得了一个好处,那就是第一个样式没有更多的行,而且它有能力添加更多的语句。

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

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

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

这样看起来好多了:

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

但是,只有在绝对确定 if/else 块中没有其他内容需要的情况下,才使用三元运算符!

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

例如:

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


if (argument < 0)
return false;

否则我就用第二种风格。

我更喜欢使用大括号。添加大括号可以使阅读和修改更加容易。

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

省略语句块的一个问题就是 else 模糊性。C 语言忽略了缩进,因此没有办法将其分开:

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

由此可见:

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

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

但是对于现代 IDE 和代码自动生成(或自动完成) ,我强烈推荐使用第二种形式,这样您就不用花费额外的时间键入花括号,并且可以避免一些最常见的 bug。

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

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

这与清楚明确地命名你的变量、方法、文件或正确缩进它们是一样的。

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

我个人喜欢混合使用空格和括号,如下所示:

if( statement ) {


// let's do this


} else {


// well that sucks


}

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

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

而不是:

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;

如果你把花括号放进去就好多了。

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

如果“ If”语句是为了执行某些操作(例如调用函数、配置变量等)而进行测试,则使用大括号。

if($test)
{
doSomething();
}

这是因为我觉得您需要弄清楚调用的函数是什么,程序的流向是什么,在什么条件下。让程序员准确地理解在这种情况下调用什么函数和设置什么变量对于帮助他们准确地理解程序正在做什么非常重要。

如果“ If”语句是为了停止某些操作而进行测试(例如,循环或函数中的流控制) ,则使用单行。

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

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