为什么++重载运算的加法会导致未过期的值
Why the addtion of ++overloaded operation results into unexpted values?
请参阅代码
#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++
这样的递增和递减总是一个好主意。可读性比显示您知道操作员优先级要好得多。
++
是函数调用。因此,首先将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) );
希望这能让事情变得更清楚。
后缀增量的两个调用是不确定顺序的——这意味着我们不知道会先调用哪一个。在您的情况下,这并不重要,因为它们都是在同一个对象上调用的,但不依赖于任何特定的顺序——即使在程序的同一执行过程中,也不需要一致。
相关文章:
- 继承函数的重载解析
- 你能重载对象变量名本身返回的内容吗
- 从父命名空间重载类型
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 重载操作程序时出错>>用于类中的字符串 memebr
- 一个关于在C++中重载布尔运算符的问题
- 不同翻译单元中不可重载的非内联函数定义
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 将重载的成员函数传递给函数模板
- c++:可变模板和函数重载
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 重载==不适用于二进制树
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 重载运算符new[]的行为取决于析构函数
- 正在尝试重载二进制搜索树分配运算符
- 重载Singly Linked List中的赋值运算符
- 为什么++重载运算的加法会导致未过期的值