2009-06-16 119 views
1

我已经看到了这一点,但从来没有听清楚为什么......这真的适用于任何语言,不只是C#或VB.NET或Perl或其他。比较项目的顺序?

比较两个项目时,有时“检查”值放在左侧而不是右侧。在逻辑上,我首先列出你的变量,然后列出你正在比较的值。但我看到了相反的情况,其中“常数”列在第一位。

这种方法有什么(如果有的话)收益?

所以不是:

if (myValue > 0) 

我看到:

if (0 < myValue) 

if (Object.GimmeAnotherObject() != null) 

被替换为:

if (null != Object.GimmeAnotherObject()) 

对此有何想法?

TIA! Kevin

+0

我认为它是特定于C语言的,或者是语句中带有赋值语句特定的 – Paco 2009-06-16 11:45:03

回答

8

一些开发商提上不断离开,像这样

if(0 = myValue) 

这是因为你会从编译器得到一个错误,因为你不能分配值0。取而代之的是,你必须将其更改为

if(0 == myValue) 

这可以防止出现痛苦的调试的道路,因为打字

if(myValue = 0) 

是完全合法的,但最有可能你的意思

if(myValue == 0) 

第一选择不是你想要的。它会巧妙地改变你的程序并导致各种头痛。希望澄清!

+0

请记住,在许多较新的语言中,如果(myValue = 0)不是有效的代码,因为myValue = 0会计算一个数字,if ()不适用于一个数字作为条件 – 2009-06-16 11:43:48

+0

@David欢迎来到伪代码的世界:) – samoz 2009-06-16 11:44:28

2

我不认为像一个简单的规则,但恒定的第一或最后不变是不是一个非常聪明的选择。我相信支票应该表达它的语义。例如,我更喜欢在范围检查中使用这两个版本。

if ((low <= value) && (value <= high)) 
{ 
    DoStuff(value); 
} 

但我同意你提到的例子 - 我会但不变的最后,并且可以看到没有任何理由以另一种方式做它。

if (object != null) 
{ 
    DoStuff(object); 
} 
2

在C++中这两种都是有效的,并编译

if(x == 1) 

if(x=1) 

,但如果你把它写这样

if(1==x) 

if(1=x) 

然后分配给1被捕获并且代码不会被编译。

把const变量放在左边是比较安全的。

一旦你进入把const的变量在左边的赋值它往往成为操作的默认模式的习惯,这就是为什么你看到它显示在平等的检查,以及

1

它的编码实践例如,输入'='等类型为'='的拼写错误。

如果左边有一个CONSTANT,则编译器会捕获所有赋值运算符,因为您无法将其分配给常量。

许多语言(特别是C)在编写代码时有很大的灵活性。同时,左边的常量似乎是不寻常的话,你也可以计划的任务和条件在一起,

if (var1 = (var2 & var3)) { /* do something */ } 

此代码将获得布尔结果为var1也/ *做某事* /如果结果是真正。

相关的编码习惯是避免编写代码,其中条件表达式具有分配内容;尽管编程语言允许这样的事情。你不会遇到这样的代码很多,因为在条件内的分配是不寻常的,所以典型的代码没有这样的事情。

IBM DeveloperWorks网站上有一个很好的C语言编码实践文章,可能仍然与用该语言编写的人相关。

2

对于.NET,这是无关紧要的,因为编译器不会让你做出像条件的任务:

if(x=1) 

因为(其他人说的)这是不好的做法(因为它很容易错过)。

一旦您不必担心这个问题,首先将变量放在第一位,然后再将值放在第二位,但这是唯一的区别 - 双方都需要进行评估。