C++ 不等式的算子交换性!=在C++;

C++ 不等式的算子交换性!=在C++;,c++,operator-keyword,C++,Operator Keyword,我有一个关于以下表达式的快速问题: int a_variable = 0; if(0!=a_variable) a_variable=1; “(0!=a_变量)”和“(a_变量!=0)”之间有什么区别? 我现在没有任何错误,但这是一种错误的使用方法吗???如果你忘记了,第一个将给出一个错误(0=a_变量),第二个将造成严重破坏(a_变量=0) 此外,使用用户定义的运算符,第二种形式可以通过成员函数实现,而第一种形式只能是非成员(可能是朋友)函数。虽然这是一个非常糟糕的想法,但用不同的方式

我有一个关于以下表达式的快速问题:

int a_variable = 0;
if(0!=a_variable)
   a_variable=1;
(0!=a_变量)
”和“
(a_变量!=0)
”之间有什么区别?
我现在没有任何错误,但这是一种错误的使用方法吗???

如果你忘记了
,第一个将给出一个错误
(0=a_变量)
,第二个将造成严重破坏
(a_变量=0)


此外,使用用户定义的运算符,第二种形式可以通过成员函数实现,而第一种形式只能是非成员(可能是朋友)函数。虽然这是一个非常糟糕的想法,但用不同的方式定义这两种形式是可能的。当然,由于
a_变量
int
,因此在本例中没有有效的用户定义运算符。

0!=x
x!=0

它可能产生的任何差异都是参数求值的顺序<代码>a!=b
通常会评估
a
,然后评估
b
并比较它们,而
b!=一个
会反过来做。然而,我在某处听说,在某些情况下,评估的顺序是不确定的

它对变量或数字没有太大的影响(除非变量是一个重载了
!=
运算符的类),但在比较某些函数调用的结果时,它可能会产生影响

考虑

int x = 1;
int f() {
  x = -1;
  return x;
}
int g() {
  return x;
}
假设操作数是从左到右求值的,那么调用
(f()!=g())
将产生
false
,因为
f()
将求值为
-1
g()
-1
,而
(g()!=f())
将产生
true
,因为
g()
将计算为
1
f()
-到
-1


这只是一个例子——最好不要在现实生活中编写这样的代码

吹毛求疵,这是交换性,不是结合性。关联性将是
(a!=b)!=c
a!=(b!=c)
(一般来说,它不是)。实际上它是对称的。运算是可交换的(有时),关系是对称的(有时)。@Beta:谢谢,这是我没想到的词。当然,如果我真的想挑剔,我会问是否
=
是一个操作或一个关系,但我们现在不去那里。在带有运算符重载的langauges中,您不知道。它们可能确实会使整个系统过载
int&rhs
的运算符是不同的。。。当然,在这种情况下,它是一个int,但它绝对重要!这是一个无效的假设,C++没有对比较操作符的操作数的评价顺序作出承诺。我只是想指出,这可能是这类函数的不同之处。然而,据我所知,当操作员
=在类中重载,然后
a!=b
扩展为
a.运算符=(b) 
,然后必须首先计算左侧操作数。还是我错了?在
a.operator=(b) 
a
b
操作员之前进行评估=,无法保证是否在
b
之前对
a
求值,在
a
之前对
b
求值,或者每个子表达式的步骤是混合的。顺序始终是未定义的,而不是“在某些情况下”