-1

查看代码

#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;
}

对于语句b = a++ + a++,我们认为的期望值为 20,但上面的语句导致了 21。

如何?

请帮帮我。

4

5 回答 5

3

根据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++在复杂表达式中使用增量和减量总是一个好主意。可读性比表明您了解操作员的优先级要好得多。

于 2013-08-29T12:21:52.397 回答
2

正如查尔斯指出的那样,++对 A 对象的调用是函数调用。因此,您首先将 i 从 10 增加到 11 并返回 10,然后在第二次调用中将 i 从 11 增加到 12 并返回 11。您将 10 和 11 添加到 21。

于 2013-08-29T12:18:12.663 回答
1

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

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

于 2013-08-29T12:21:31.940 回答
0

重载的运算符只是名称很有趣的函数。它们的行为不一定与内置的相同。如果您想对内置类型的对象执行相同的表达式 - 不要,行为将是未定义的。

您还没有显示operator+for的定义A- 我假设它是一个免费函数。然后表达式b = a++ + a++;可以重写为

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

希望这有助于使事情更清楚。

对 postfix increment 的两次调用是不确定的——这意味着我们不知道哪个会首先被调用。在您的情况下并不重要,因为它们都在同一个对象上调用,但不依赖于任何特定的顺序 - 即使在程序的相同执行期间,它也不需要是一致的。

于 2013-08-29T13:38:43.690 回答
0

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

你的代码是:

b = a++ + a++;

我认为您将其与以下内容混淆了:

b = a + (a++)++;
于 2013-08-29T12:52:22.947 回答