为了账号安全,请及时绑定邮箱和手机立即绑定

C++输出顺序的问题

C++输出顺序的问题

C++
慕粉18341035298 2017-03-27 22:23:38
代码如下我的问题是为什么输出结果是mistakesdafa-842150451而不是sdafamistakea[0]为什么先输出mistake然后在sdafa后返回了a[0]而不是先输出sdafa后输出mistake 和a[0]#include<iostream> #include<cmath> using namespace std; class arr{ public: arr(int s = 0); ~arr(); int & operator[](int i); private: int *p; int size; }; arr::arr(int s){ size = s; if (size == 0){ p = NULL; } else p = new int[size + 1]; for (int i = 1; i <= size; i++) p[i] = 0; } arr::~arr(){ if (!p) delete[] p; } int& arr::operator[](int i){ if (i<1 || i>size){ cout << "mistake" << endl; return p[0]; } return p[i]; } int main(){ arr a(5); cout << "sdafa" << a[9] << endl; }
查看完整描述

3 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

cout << "sdafa" << a[9] << endl;  这个复合表达式中是连续三次 operator<< 函数调用。

C++ 语言明确规定了运算符的运算顺序。重载运算符的运算顺序也会按照这个顺序来执行(<< 运算符从左到右运算),所以肯定会是先执行 << "sdafa"、再 << a[9]、最后 << endl。  请注意,这个顺序指的是运算符的运算顺序,也就是 << 函数的调用顺序,和 "sdafa"、a[9] 什么的没关系。   那 "sdafa"、a[9] 是什么? 它们是运算符的操作数。


但是:C++语言没有规定操作数的求值顺序! 你的例子中 a[9] 是操作数,并且你重载了 [] 运算符,那么所谓“a[9] 的求值”就是调用 a[9] 这个函数。 这个 a[9] 函数是什么时候调用的呢? 是在执行 << a[9] 时才调用的吗?  答案是:不知道! C++ 并不保证一定会在执行这个 << a[9] 函数时才调用 a[9] 函数,<< a[9] 这个函数需要的参数是 a[9] 的返回值,只要在执行 << 函数前获得这个返回值就可以了,也就是说 a[9] 只要在这之前被调用计算出返回值就可以。 甚至 a[9] 的调用可能比 << "sdafa" 函数的调用时间更早(在你的这个例子中似乎确实是这样)。

你重载运算符 [] 并不只是简单地返回一个值,还有可能输出一个 "mistake"。 那么结合程序的运行结果,你应该可以推断出来,这个 a[9] 的调用时间要早于 << "sdafa" 的调用时间,所以会先输出了"mistake"。


再强调一下:仅仅是 a[9] 的调用时间不确定,而 << 运算符函数的调用顺序是确定的(一定是先 << "sdafa"、再 << a[9]、最后 << endl),所以在输出 a[9] 的返回值之前一定是先输出了 "sdafa",最后再输出 endl(也就是换行)的。

查看完整回答
1 反对 回复 2017-03-29
?
asd8532

TA贡献143条经验 获得超187个赞

cout参数入栈的顺序是从右到左...例如cin < <a < <b < <c;在栈中的位置如下:c-b-a.. <-(栈指针);但是输出是从栈指针的位置开始的,意思即这时的输出顺序仍然是abc,而你的[]已经重载了,所以里面的输出提前输出了,而return又是本来的顺序

查看完整回答
1 反对 回复 2017-03-28
  • onemoo
    onemoo
    你是认真的吗?! cout << a << b << c; 这是连续三次函数调用,每次只有一个参数,这不是参数入栈的问题啊。
  • asd8532
    asd8532
    主要是容易理解,虽然是无定义的行为不过一般都这么执行,我对不起党的培养,我是非计算机专业的非计算机从业者
  • onemoo
    onemoo
    我也是野生程序员...
点击展开后面1
  • 3 回答
  • 1 关注
  • 1623 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信