对单行 if 或循环使用大括号(即 {})的目的是什么?

新手上路,请多包涵

我正在阅读我的 C++ 讲师的一些讲义,他写了以下内容:

  1. 使用缩进 // OK
  2. 永远不要依赖运算符优先级 - 始终使用括号 // OK
  3. 始终使用 { } 块 - 即使是单行 // 也不行,为什么 ???
  4. 比较左侧的 const 对象 // OK
  5. 对 >= 0 的变量使用无符号 // 好技巧
  6. 删除后将指针设置为 NULL - 双重删除保护 // 不错

我不清楚第三种技术:通过在 { ... } 中放置一行我会得到什么?

例如,拿这个奇怪的代码:

 int j = 0;
for (int i = 0 ; i < 100 ; ++i)
{
    if (i % 2 == 0)
    {
        j++;
    }
}

并将其替换为:

 int j = 0;
for (int i = 0 ; i < 100 ; ++i)
    if (i % 2 == 0)
        j++;

使用第一版有什么好处?

原文由 JAN 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

当我们增加 --- 时,我们也尝试修改 i j

 int j = 0;
for (int i = 0 ; i < 100 ; ++i)
    if (i % 2 == 0)
        j++;
        i++;

不好了!来自 Python,这看起来不错,但实际上并非如此,因为它相当于:

 int j = 0;
for (int i = 0 ; i < 100 ; ++i)
    if (i % 2 == 0)
        j++;
i++;

当然,这是一个愚蠢的错误,但即使是有经验的程序员也会犯。

ta.speot.is 的回答 中指出了 另一个很好的理由

我能想到的 第三 个是嵌套的 if 的:

 if (cond1)
   if (cond2)
      doSomething();

现在,假设您现在想要 doSomethingElse()cond1 不满足(新功能)。所以:

 if (cond1)
   if (cond2)
      doSomething();
else
   doSomethingElse();

这显然是错误的,因为 else 与内部 if --- 相关联。


编辑:由于这引起了一些关注,我将澄清我的观点。我正在回答的问题是:

使用第一版有什么好处?

我已经描述了。有一些好处。但是,IMO,“总是”规则并不总是适用。所以我不完全支持

始终使用 { } 块 - 即使是单行 // 不行,为什么 ???

我并不是说 总是 使用 {} 块。如果这是一个足够简单的条件和行为,请不要。如果您怀疑有人稍后可能会进来并更改您的代码以添加功能,请执行此操作。

原文由 Luchian Grigore 发布,翻译遵循 CC BY-SA 3.0 许可协议

在营地“总是使用牙套”10 年后,我最近转而不再使用它们。主要是受到鲍勃叔叔关于如何编写干净代码的一些论点的启发,我现在相信不使用大括号编写它们更具可读性。

 if(guardClause)
      throw new SomeException(..)

Bob 大叔认为,在 if/for 语句中编写多行代码是一种潜在的可读性气味。

例如

if(someCondition)
{
   doTechnicalThingX();
   doTechnicalThingY();
   doTechnicalThingZ();
}

可能应该重构为

if(someCondition)
    doFunctionalThingA();

不知何故,不把大括号放在那里是有帮助的,因为我得到提醒,我在 if 块中编写了太多代码。

我确实相信代码风格是其他人提到的团队决定。

原文由 Michiel Cornille 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏