【问题标题】:What are the good practise about "if" "elseif" "else" statement [closed]关于“if”“elseif”“else”语句的良好做法是什么[关闭]
【发布时间】:2019-09-12 19:51:13
【问题描述】:

我不确定是否应该在此处发布此内容,但我今天刚刚与一位同事就 C++ 良好实践进行了辩论,但我找不到我们在 CppCoreGuidelines 或任何论坛中讨论的要点。

我们谈论的是"if" "else if" "else" 声明,而我的同事说如果你有一个"if - else if" 声明,那么你必须输入一个"else",即使它是空的。 p>

例如,在他看来,这样的事情不是好的做法。

if (condition1)
{
    // Some instructions to do when condition1
    ...
}
else if (condition2)
{
    // Some instructions to do when condition2
    ...
}

我宁愿写这段代码:

if (condition1)
{
    // Some instructions to do when condition1
    ...
}
else if (condition2)
{
    // Some instructions to do when condition2
    ...
}
else
{
    /* Do nothing */
}

他的主要观点是,就像switch 语句必须有一个default 一样,if - else if 语句必须有一个else

我有几个问题:

  • 这是真的吗?
  • 如果是,为什么? (我不明白这个问题)。
  • 为什么有些指南要强制这样做?

【问题讨论】:

  • “这是真的吗?” - 不,不是。开关也不是这样。
  • else{ /* Do nothing */ } 被浪费了。你不会有 else 语句什么都不做。
  • 见仁见智。这当然不是必需的。但是您可能会争辩说,它明确表明您不打算在最终的else 案例中发生任何事情。它消除了它的缺席是由于遗漏而引起的担忧。我觉得这不值得,但我明白为什么有人会想要推动它。
  • 这是一个基于意见的问题。简而言之,编译器会优化掉空的else。这只是您是否喜欢在代码中使用空的 else 块的问题,这只是您自己的想法。
  • 附带说明,如果您打开枚举而不给出每个可能值的大小写,某些环境会发出警告。如果您提供可能需要也可能不需要的默认值,您将不会收到该警告。

标签: c++


【解决方案1】:

这都是非常私人的。

这是真的吗?

从语言合法性的角度来看,不,那是错误的。

一些指导方针可能希望程序员显式添加else 语句,但就我个人而言,这听起来像是一种反模式。

【讨论】:

  • 这是个人的,但我敢打赌,这种对“代码质量”的奇怪要求主要是由公司之间的合同强加的。对于“代码质量”的一些定义:-)
  • 问题是我看不到任何代码 sn-p 会通过省略空的“else”语句而产生错误。所以这纯粹是基于意见,以及对代码可读性的偏好是主观的,与代码效率或安全性无关,我正确吗?
【解决方案2】:

我的同事说如果你有一个“if - else if”语句,那么你必须写一个“else”,即使它是空的。

我从未遇到过这样的风格指南。而且,如果有的话,这只是一个见仁见智的问题。

我有时会写“空的”else 块,但只有当它们包含一些有趣的、有用的、解释性的记录评论,说明为什么在 else 案例中没有发生任何事情时,乍一看似乎很自然做。

if (FozzieBearIsAlive())
{
   GiveMissPiggyATreat();
}
else
{
   // Miss Piggy doesn't deserve a treat, because she may
   // have killed Fozzie Bear
}

这是一个非常人为的例子,否则可以这样写:

// Give Miss Piggy a treat, but only if Fozzie Bear is alive
// because otherwise we might wonder whether she killed him
if (FozzieBearIsAlive())
{
   GiveMissPiggyATreat();
}

但有时前者更好。

强制您始终包含一些空的 else 块,其中没有任何内容,但我没有听说过也不会支持。

他的主要观点是,就像 switch 语句必须有默认情况一样

也是错误的,除非在某些主观风格指南的意义上。

事实上,当打开枚举时,我不鼓励default 的情况,除非你在功能上需要一个,因为你防止编译器在你添加枚举时警告你并且忘记更新你的所有@ 987654327@es.

【讨论】:

  • 如果我们事先知道小猪小姐的意图就好了。
  • @SombreroChicken 不幸的是,她的意图是通过 UDP 传输的,因此不能依赖收据。
  • 感谢您的回答,虽然我就是这么想的,但由于我不是 C++ 专家,他让我怀疑它只是基于意见的事实。由于省略了空的“else”语句,我看不到任何会产生错误的代码。
  • @PierreBaret 不,我也不能。我可以有点理解为什么一个非常严格的环境(制造太空火箭)可能会要求完整 避免疑虑(“我没有忘记不应该存在的 else 声明!”),但这很愚蠢(“哦,哎呀,我放了 else 声明但忘记了它的全部内容,没有人注意到, 特别是因为他们习惯于看到到处都是空的else 块) 并且你不太可能用 C++ 编程太空火箭。再说一次,你会遇到各种奇怪的风格意见; )
【解决方案3】:

首先,switch 语句确实需要default 大小写。事实上,它们可能完全是空的:

switch (...) {
    // fine
}

同样,if 不需要else

有些指南有奇怪的规则,有些可能确实要求始终在代码中明确写下所有可能的分支。但是,非常很少这样做,特别是对于分支。

我个人在合同代码上看到了非常奇怪的要求,所以我相信一些指南/认证/合同/...可能会强制要求,特别是旧的。我的猜测是他们想要“正式”,或者他们希望它有助于“代码质量”或正式验证(如果手动完成,出于某种原因......)。

【讨论】:

    【解决方案4】:

    这实际上归结为您所工作的任何项目/公司的编码指南。除此之外,这是个人喜好。

    例如,我目前的公司喜欢始终确保 switch 语句有 default 情况,并为 if 语句添加 else 子句。

    只要注意你的公司/项目的指导方针,你就会很好。

    【讨论】:

      猜你喜欢
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      相关资源
      最近更新 更多