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
在操作员之前进行评估=调用code>,无法保证是否在b
之前对a
求值,在a
之前对b
求值,或者每个子表达式的步骤是混合的。顺序始终是未定义的,而不是“在某些情况下”