我想检查一个值是否等于1.以下代码行是否有任何区别
评估值== 1
1 ==评估值
就编译器执行而言
答案 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来说,写入相等操作数的顺序无关紧要;无论如何,编译器应该标记错误。