i==0和0==i有什么区别吗?

9

第一段代码:

  if(i==0) {// do instructions here}

第二段代码:

  if(0==i) { // do instructions here }

什么是块之间的区别?

8
不会因为你忘了一个 = 而让你花费时间进行调试。 - alex
3
如果你使用的是C#,那么你至少不用担心“if (i=0) {}”这个问题,因为这种语法是非法的。 - Chris Farmer
2
@KendallFrey 这是C++中的一个有效表达式,因此编译器没有什么可以捕捉的。 - juanchopanza
1
然而,@Juan,一些C ++编译器仍然会捕捉到它。这是实现质量问题。 - Rob Kennedy
1
如果你重载了 == 运算符(并非所有列出的语言都支持),你可以使 A == B 与 B == A 不同(不是说你应该这样做,但你可以这样做)。 - Servy
显示剩余5条评论
8个回答

32

从功能上讲,两种写法并没有区别。
一些开发人员更喜欢使用第二种格式,以避免赋值拼写错误(如果你漏了一个=),这样编译器就会警告拼写错误。
第二种被广为人知的名字是尤达条件

尤达条件

我说没有区别的原因是,你不能针对每个微小的细节都保护自己,并依靠编译器大声呼喊指出错误。如果你打算写一个==,那么你应该期望自己写一个==而不是=
使用第二种格式只会导致一些晦涩难懂的代码。
另外,大多数主流编译器都会在启用所有警告之后通过发出警告来提醒你拼写错误的是“赋值”而不是“相等”(无论如何你都应该启用所有警告)。


3
很遗憾他们没有在术语问题上设置历史锁。 - Conrad Frix
+1 for Yoda Condition & Pokemon Exception Handling. 以前从未听说过这些术语。 - John Dibling
@ConradFrix:他们不仅锁定了它,而且已经删除了它,现在只有10k+的用户可以看到它。 - John Dibling
@JohnDibling,那差不多就是我的观点了。我不介意通过 历史锁定 重新激活这个问题。 - Conrad Frix
确实,这是一个非常适合进行历史锁定的对象。删除它是不恰当的,也没有任何有价值的成果。 - R.. GitHub STOP HELPING ICE
一些开发者 == 业余爱好者 :) - Super-intelligent Shade

7
第二个版本应该更安全。
如果你忘记一个等号,它不会将 i 的值改为零。

5

在C语言中,从功能上讲它们是相同的;我不确定其他涉及丑陋操作符重载的语言是否也是这样。

从风格上看,后者非常反直觉,个人认为它极其丑陋。关键是当你意外写成=而不是==时,让编译器引发一个错误,但是好的编译器已经有了一个选项来警告您,因此这是不必要的。


1
运算符重载很美妙!(当应用得当时。)这是我一次又一次喜爱 C++ 的原因之一。 - leemes

3

对于C++,虽然可能性很小,但可能存在差异。这取决于i的类型。例如:

struct Foo
{
    int x;
};

bool operator==(Foo lhs, int rhs)
{
    return lhs.x == rhs;
}

bool operator==(int lhs, Foo rhs)
{
    std::cout << "Hi!";
    return true;
}

像那样编写代码的人当然应该被开除了。


2

1

当你写(0==i)时,误用单个等号符号的错误(例如)if (i = 0)被消除。没有其他问题。


1

其实两种写法没有区别,只是有些人更喜欢第二种方式来避免常见的错误——误用赋值符号(=)而非等于符号(==)。

0 = i 这样的代码在编译时会失败。


0
在C#中没有区别。然而,在C++中有性能差异,这就是为什么现在在C#代码中你会看到两者都被使用 - 实际上我在考虑i++和++i的性能差异 - 在C/C++中,0 == i是一个常见的编码建议,以避免i = 0成为一种意外操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接