==运算符和操作数

时间:2009-03-24 13:00:31

标签: operators equality

我想检查一个值是否等于1.以下代码行是否有任何区别

评估值== 1

1 ==评估值

就编译器执行而言

12 个答案:

答案 0 :(得分:17)

在大多数语言中都是一样的。

人们经常做1 ==评估值,因为1不是左值。这意味着您不会意外地完成任务。

示例:

if(x = 6)//bug, but no compiling error
{
}

相反,您可以强制编译错误而不是错误:

if(6 = x)//compiling error
{
}

现在,如果x不是int类型,并且你正在使用类似C ++的东西,那么用户可能已经创建了一个operator ==(int)override,它将这个问题带到了新的含义。在这种情况下6 == x不会编译,但x == 6会。

答案 1 :(得分:9)

这取决于编程语言。

在Ruby,Smalltalk,Self,Newspeak,Ioke和许多其他单调度面向对象编程语言中,a == b实际上是一个消息发送。例如,在Ruby中,它等同于a.==(b)。这意味着,当您编写a == b时,==类中的方法a会被执行,但是当您编写b == a时,那么执行b的类。所以,显然不是同样的事情:

class A; def ==(other) false end; end
class B; def ==(other) true  end; end

a, b = A.new, B.new

p a == b # => false
p b == a # => true

答案 2 :(得分:5)

不,但如果您不小心输入

,后一种语法会给您一个编译器错误
if (1 = evaluatedValue)

请注意,如果您编写

,今天任何体面的编译器都会发出警告
if (evaluatedValue = 1)

所以它主要与历史原因相关。

答案 3 :(得分:5)

取决于语言。

答案 4 :(得分:3)

在Prolog或Erlang中,==写成=并且是统一而不是赋值(你断言值是相等的,而不是测试它们是相等的还是强迫它们如果左边是常数,你可以用它作断言,如here所述。

因此X = 3将统一变量X和值3,而3 = X会尝试将常量3统一为当前值{ {1}},并且在命令式语言中等同于X

答案 5 :(得分:2)

这是同样的事情

答案 6 :(得分:2)

一般来说,无论你是否使用, 评估值== 1 OR 1 ==评估值。

使用对您而言更具可读性的内容。我更喜欢(评估值== 1),因为它对我来说更具可读性。

而且,我想引用一个众所周知的java中字符串比较的场景。 考虑一个String str,你需要比较另一个字符串“SomeString”。

str = getValueFromSomeRoutine();

现在在运行时,您不确定str是否为NULL。所以为了避免异常,你会写

if(str!=NULL)
{
   if(str.equals("SomeString")
   {
      //do stuff
    }
}

要避免外部空检查,你可以写

if ("SomeString".equals(str))
{
   //do stuff
}

虽然这种可读性较低,但又取决于上下文,这样可以节省额外费用。

答案 7 :(得分:1)

对于这个以及类似的问题,我建议您通过编写一些代码,通过编译器运行它并查看发出的asembler输出来自行查找。

例如,对于GNU编译器,使用-S标志执行此操作。对于VS编译器,最方便的方法是在调试器中运行测试程序,然后使用assembeler调试器视图。

答案 8 :(得分:1)

有时在C ++中,如果评估的值是用户类型并且定义了operator ==,则它们会执行不同的操作。不好。

但是很少有人会选择一种方式而不是另一种:如果operator ==不是可交换/对称的,包括值的类型是否有来自int的转换,那么你有一个可能需要的问题修理而不是解决。布莱恩·R·邦迪(Brian R. Bondy)和其他人的回答可能是为什么有人在实践中担心它的原因。

但事实仍然是即使operator ==是可交换的,编译器也可能不会在每种情况下完全完全。它(根据定义)将返回相同的结果,但它可能以稍微不同的顺序或其他任何方式执行操作。

答案 9 :(得分:0)

if value == 1
if 1 == value

完全相同,但如果你不小心做了

if value = 1
if 1 = value

第一个将起作用,而第二个将产生错误。

答案 10 :(得分:0)

他们是一样的。有些人更喜欢把1放在第一位,以便无意中落入打字陷阱

 evaluated value = 1

如果左侧的值可分配,则可能会很痛苦。例如,这是C中常见的“防御性”模式。

答案 11 :(得分:0)

在C语言中,常常将常量或幻数放在第一位,这样如果你忘记了等式检查(==)中的一个“=”,那么编译器就不会将其解释为赋值。

在java中,你不能在布尔表达式中进行赋值,因此对于Java来说,写入相等操作数的顺序无关紧要;无论如何,编译器应该标记错误。