【问题标题】:Are semicolon-terminated if-statements good coding practice?以分号结尾的 if 语句是良好的编码习惯吗?
【发布时间】:2014-03-01 20:19:51
【问题描述】:

我正在循环 i、j、k 和 n。我想要执行一个语句,除非k == jn == k 时。

如果我使用这样的代码:

if (k != j && n != i)
      //statement

语句在两种情况下不会执行:

  1. 当 k != j 当 n == j 时。
  2. 当 k == j 当 n != j 时。 (这不是我需要的

所以我使用了这样的代码:

if (k == j && n == i)
    ;else
    //statement

通过这段代码,语句将成功执行,除非k == j && n == i

以分号结尾的 if 语句是用 C++ 编码的好方法吗?

【问题讨论】:

  • 为什么不直接否定条件呢?如果看起来不愉快,也许 DeMorganized 版本会有所帮助。
  • if (!(k==j && n==i)) 我认为应该做同样的事情,但我不太了解 c\c++,所以不要坚持。
  • 这是一种糟糕的编码方式。
  • 如果你真的想要这样做(例如,因为if (a); else if (b) {...} else if (c) {...} else {...} 之类的东西),你不妨用空括号替换第一个分号,这样编译器就不会抱怨,或将分号移到新行(至少 Clang 喜欢这样)。
  • @owleye,是的,确实没有理由(在正常情况下)有一个空的 if 和 else。

标签: c++ coding-style


【解决方案1】:

不,这不是一种好的编码方式。通常的做法是使用!来反转逻辑:

if(!(k==j && n==i))
    //statement

或者您可以使用De Morgan's Law 反转逻辑:

if(k!=j || n!=i)
    //statement

【讨论】:

  • 您在第一个代码示例中缺少右括号。
【解决方案2】:

您的问题是您错误地否定了条件。你应该这样做:

if (!(k==j && n==i))
  // statement

或者,根据德摩根定律:

if (k != j || n != i)
  // statement

【讨论】:

    【解决方案3】:

    ...是一种好的编码方式吗?

    没有。

    你应该写

    if (!(k == j && n == 1))
    {
        //statement
    }
    

    ifforwhile 之后放置分号几乎总是错误的。这是非常出乎意料的,并且使阅读您的代码变得非常困难。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      相关资源
      最近更新 更多