为什么++重载运算的加法会导致未过期的值

Why the addtion of ++overloaded operation results into unexpted values?

本文关键字:过期 重载 运算 为什么      更新时间:2023-10-16

请参阅代码

#include<iostream.h>
#include<conio.h>
class A{
   private:
      int i;
   public:
      A()
      {
         i=10;
      }
      A operator++(int)
      {
         A tmp=*this;
         i +=1;
         return tmp;  
      }
      display()
      {
         cout<<i;
      }
};
int main()
{
   A a,b;
   b=a++ + a++;
   cout<<endl<<b<<"t"<<a;
   return 0;
}

对于语句CCD_,但上述声明的结果是21。

如何?

请帮帮我。

根据cppreference,您的代码等于b = (a++) + (a++)
因此,计算它,我们有:

a = 10;
tmp1 = a++;//tmp1 = 10, a = 11
tmp2 = a++;//tmp2 = 11, a = 12
b = tmp1 + tmp2 // 10 + 11 = 21

还要记住,像b = a++ + a++;这样的结构可读性很差,所以你应该总是使用括号,而且在复杂的表达式中避免使用像a++这样的递增和递减总是一个好主意。可读性比显示您知道操作员优先级要好得多。

正如Charles所指出的,对对象调用的++是函数调用。因此,首先将i从10增加到11并返回10,然后在第二次调用中将i从11增加到12并返回11。你把10和11加起来,最后得到21。

第一个调用将a递增到11并返回10。第二次调用将CCD_ 7增加到12并返回11。听起来21是正确的。

也就是说,评估的顺序(++是"第一个调用")是未指定(感谢JD),因此在同一表达式中使用两次通常不是一个好主意。

我将以简单比较的形式给出我的答案。

您的代码是:

b = a++ + a++;

我想你把它和混淆了

b = a + (a++)++;
重载运算符只是具有有趣名称的函数。它们的行为与内置的并不一定相同。如果你想对内置类型的对象执行相同的表达式,那么行为将是未定义的。

您还没有显示operator+b = a++ + a++0的定义——我认为这是一个免费函数。表达式b = a++ + a++;可以被重写为

b = operator+( a.operator++(0), a.operator++(0) );

希望这能让事情变得更清楚。

后缀增量的两个调用是不确定顺序的——这意味着我们不知道会先调用哪一个。在您的情况下,这并不重要,因为它们都是在同一个对象上调用的,但不依赖于任何特定的顺序——即使在程序的同一执行过程中,也不需要一致。