使用 if(0 == foo()) 而不是 (foo() == 0) 有什么好处?

What's the advantage of using if(0 == foo()) rather than (foo() == 0)?

本文关键字:foo 什么 if 使用      更新时间:2023-10-16

我发现一些程序员喜欢在比较器操作符中这样编码。

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

foo() == 0在可读性方面有什么不同吗?使用0 ==foo()的优势是什么?

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

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

所以someVarString可以为空,测试仍然有效。然而,如果你把测试翻转到:

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

如果someevarstring为空,将导致NPE

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

0 == foo

是确保你没有忘记一个=它会使

if (0 = foo)

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

if (foo = 0)

会产生一个难以发现的bug。

这种风格的优点是,在所有情况下,如果您键入=而不是==,编译器肯定会报错,因为您不能为数字赋值。

例如

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

将无法编译,而

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

不是非法的(它可能会产生编译器警告)

这就是说,我同意它看起来很丑,而且通常是反过来的。

没有性能影响,人们这样做的原因是确保他们不会不小心键入=操作符而不是==比较操作符(因为编译器会抱怨你不能给常量赋值)。

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

就性能而言,没有。

可读性是主观的;我个人觉得0 == foo()foo() == 0读起来稍微别扭一些。

我看到的唯一支持if (0 == var)的论点是,如果你不小心把这个错误地输入为if (0 = var),编译器会报错。然而,大多数现代编译器在看到if (var = 0)时会发出警告,使该参数无效。此外,这种思路甚至不适用于您的情况,因为if (foo() = 0)不是有效代码。