3 回答
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(也就是换行)的。
TA贡献143条经验 获得超187个赞
cout参数入栈的顺序是从右到左...例如cin < <a < <b < <c;在栈中的位置如下:c-b-a.. <-(栈指针);但是输出是从栈指针的位置开始的,意思即这时的输出顺序仍然是abc,而你的[]已经重载了,所以里面的输出提前输出了,而return又是本来的顺序
- 3 回答
- 1 关注
- 1680 浏览
添加回答
举报