C++ 为什么首选if(常量==变量)而不是if(变量==常量)
可能重复:C++ 为什么首选if(常量==变量)而不是if(变量==常量),c++,c,C++,C,可能重复: 比如说, int k =5; if( 5 == k ) { } 优先于 if (k == 5) { } 它只是为了格式化的目的,还是有什么原因?因为这种形式使得忘记一个等号更难引入bug。想象一下,如果你这样做: if (k = 5) 这是一个比较,但现在它是一个任务!更糟糕的是,它是合法的,并且它会以多种方式打乱您的程序(改变k的值,并且条件值总是计算为true) 将此与 if (5 = k) 这是不合法的(您不能指定文字),因此编译器会立即将其标记为
比如说,
int k =5;
if( 5 == k )
{
}
优先于
if (k == 5)
{
}
它只是为了格式化的目的,还是有什么原因?因为这种形式使得忘记一个等号更难引入bug。想象一下,如果你这样做:
if (k = 5)
这是一个比较,但现在它是一个任务!更糟糕的是,它是合法的,并且它会以多种方式打乱您的程序(改变k
的值,并且条件值总是计算为true
)
将此与
if (5 = k)
这是不合法的(您不能指定文字),因此编译器会立即将其标记为错误
这就是说,这种编写代码的风格(条件中的赋值)在今天已经不像以前那样流行了。大多数现代编译器都会将此标记为警告,因此不太可能不被发现。就我个人而言,我不喜欢第二种形式,因为编译器在那里帮助我,所以我不使用它。这是为了避免
if( k = 5 ) {
}
如果输入和写入错误,则始终等于true。
if (k = 5) // instead of ==
然后,您可能引入了一个很难找到的bug。(事实上,以前很难找到。现在,大多数编译器都会将此标记为警告。)
但是,这将导致编译时错误
if (5 = k)
顺便说一句,这种风格被称为Yoda Conditions:-)这是因为一种常见的打字错误是键入
=
而不是=a。谁说它更受欢迎
我能想到的唯一原因是避免:
int k =5;
if( 5 = k )//notice one "="
{
}
像这样,您将得到一个编译错误,而另一种方法可以工作。但我认为它的可读性较差,也不太受欢迎。首先,大多数人更喜欢第二种形式,因为它感觉“更自然”;第一种形式被认为是“颠倒的”,事实上通常被称为“尤达条件”
使用第一种形式的基本原理是避免在错误地键入=
而不是=
时意外赋值。由于在条件语句中,您可以编写任何表达式,=
是允许的,因此在输入指令错误的情况下
if(k = 5)
{
}
不会检查k
是否等于5
,但会将5
分配给k
,并且由于=
返回对其左侧运算符的引用,该条件将被评估为true,并且始终执行if
正文
另一方面,如果您在Yoda条件中键入=
而不是=
,您将得到
if(5 = k)
{
}
这会导致编译错误,因为您无法将任何内容分配给文本(5)
虽然它们看起来是个好主意,“Yoda条件语句”看起来很奇怪,而且最重要的是,几乎所有打开警告的好编译器都会在条件表达式中编写赋值时向您发出警告,因此大多数人只使用“自然外观”形式。,重复。这家店很快就要关门了。我的建议是:不要麻烦了。让编译器警告发挥作用,并注意它们。这是因为有些人使用愚蠢的编译器,当你意外地编写if(variable=constant)
时,它们不会发出警告。或者,它们太愚蠢了,无法在编译器上启用警告。实际上,我知道java的这个规则,而不是C或C++,用于测试对象的相等性。这背后的原因是,对于任何对象o,o.equals(null)
都是false。例如,“foo.equals(bar)
,而不是bar.equals(“foo”)
。我不知道(不认为)C和C++是否重要。该问题适用于使用=和==的任何语言。原因是为了避免在Yoda条件下出现NPE.+1-忘记这一点。如果启用了编译器警告,则不难发现错误。有些人只是忽略警告。可悲的是,我以前的许多同事。。。。除非你介意你的编译器警告。