【问题标题】:What's the advantage of using if(0 == foo()) rather than (foo() == 0)? [duplicate]使用 if(0 == foo()) 而不是 (foo() == 0) 有什么好处? [复制]
【发布时间】:2011-07-25 16:40:51
【问题描述】:

我发现有些程序员喜欢在比较运算符中编写这样的代码。我发现它更难阅读......

if (0 == foo()){
    ....
}

foo() == 0 在可读性方面有什么不同吗?使用 0 ==foo() 有什么好处?

【问题讨论】:

  • 我和你在一起,我觉得这不太可读(因为它不自然)。但是大约十年前有人推动将 0 放在首位,因为当您忘记使用 '==' 而使用 '=' 时,它可以防止意外分配。就我个人而言,我发现这个论点非常弱,因为编译器实际上会警告您(并且我使用将所有警告转换为错误的标志进行编译,因此它无法为我编译,所以它从来都不是问题)。
  • @Martin:如果我没记错的话,这个论点更适用于 C,如果我没记错的话,你不会收到警告。

标签: java c++ coding-style


【解决方案1】:

在这种情况下没有区别,但在比较字符串时,最好先使用字符串常量以避免空指针异常。

if ("somestring".equals(someVarString)) {
// doSomething
}

所以 someVarString 可以为 null 并且测试仍然有效。而如果您将测试翻转为:

if (someVarString.equals("somestring")) {
// doSomething
}

如果 someVarString 为空,则会导致 NPE。

【讨论】:

    【解决方案2】:

    不,我认为这样做的最佳理由是:

    0 == foo
    

    是为了确保你不会忘记一个= 会成功的

    if (0 = foo)
    

    这通常会引发编译器错误而不是

    if (foo = 0)
    

    这会造成难以发现的错误。

    【讨论】:

    • 几乎每个 C++ 编译器都会对此发出警告。当我编写类似if(foo = 0) 的内容时,我在Visual C++ 中得到warning C4706: assignment within conditional expression。而且我设置我的编译器将警告变成错误,所以我实际上并没有被这个所困扰。
    【解决方案3】:

    这种风格的优点是,在所有情况下,如果您键入 = 而不是 ==,编译器都会抱怨,因为您不能分配给数字。

    例如

      bool a = 1;
      if (0 = a) 
      { }
      else if( 1 = a ) 
      { }
    

    不会编译, 而

    bool a = 1;
      if (a = 0 ) 
      { }
      else if( a = 1 ) 
      { }
    

    不违法(可能会产生编译器警告)

    也就是说,我同意这看起来很丑,而且通常会反其道而行之。

    【讨论】:

    • 编译器无论如何都会抱怨,因为int 不是if 条件所要求的boolean 表达式。
    • 这是一个优势的弱论据,因为编译器无论如何都会生成警告。
    • 完全同意,只是说明为什么有时会这样做
    【解决方案4】:

    没有性能影响,人们这样做的原因是为了确保他们不会意外键入 = 运算符而不是 == 比较运算符(因为编译器会抱怨你不能分配给常量)。

    我发现可读性损失比我喜欢的要多,所以我不这样做。其他人显然已经习惯了。

    【讨论】:

      【解决方案5】:

      在性能方面,没有。

      可读性是主观的;我个人觉得0 == foo()foo() == 0 读起来略尴尬。

      我看到的唯一支持if (0 == var) 的论点是,如果您不小心将其输入为if (0 = var),编译器会抱怨。但是,大多数现代编译器会在看到 if (var = 0) 时发出警告,从而使参数变得毫无意义。此外,这种思路甚至不适用于您的情况,因为 if (foo() = 0) 不是有效代码。

      【讨论】:

      • 是的,我同意你的看法,这就是为什么我很好奇为什么有些人喜欢用这种方式编码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2020-10-03
      • 2017-08-06
      • 2018-08-27
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      相关资源
      最近更新 更多