C++输出顺序的问题

代码如下

我的问题是

为什么输出结果是

mistake

sdafa-842150451

而不是

sdafamistake

a[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;
	
}



慕粉18341035298
浏览 1681回答 3
3回答

onemoo

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(也就是换行)的。

慕的地8582982

LAQTBEIYYLVENDGXTJLSGQGORORBRUHFURUKGPMQHZOEJMCFPZWSDHKTDFPYHYIOJZIWMCMIEUUJZSULILUEHGTJZCEIEOETMYOPLVSVLAQQGCIKAKZJNJBILLHDNRUDGMUFBXHXBLBKDMVXGIMVENQDNDTVFWTQEANAWQZUJMUMZQQVXUJSVFPHNBDMOYNWMCGAVRTCYVLBCAHUXXURPFCGVNJTBKTKTCZBUVSTJZVYVRNGHWVRZCSCYANNWPLAQUJAWNHRETDZPSARKMCBKZOYOYIHRUHDLJTPFCCFVUSOLAEAXQEANWSOXUPYFSOOYUENDZVIVWAWMCXTIEKXMETIZIXBQCRUSOKZQMIRJVQFUWADLUEDMCMILUQUQZYNYNPSVXAQZYUDQZIROLHDVDZVRURMISUHVRFBJTCYOXWUJEHEGCZVRCRAMBEADSHERTCHQSWMPMVIFIDMISIKGQCSVUWZBXNCYSUKNQZVEHOEWXHCSNQZIYUGIKUQSPEOEMSOKCLTCZOLUZLOBQFPEHQGZUVLGQMCMBEDYNBKFPEBXTFMCWFHKMWYOBBDTCEADSBCPYOCLNKNQUWWYHQACFBCGJPWSJSNILVXTTJMDZAJFCYOBPZVYTWMOFOFOYBKBRIBRABZVPSUIRODGZMOBDSIKHPMZDTBQGJFVQUUCSBWFBSCRHTYOUXSWFOXMTIYBXHKNWMPTWYCRAQSDZHHROXNVYHEOEKBDNDZPLUKAGKAEZVSNJMIHKUKZPSBRACOQTKZVMCDZOBJZNQQKFZZLMNNFYHRBERBTKZOVIMGDGNKIPZLBSOUXQNTNKLMSCFYMXSAKKWUUPSYCIFRQUUENDHULYGWIZIIEPMHHZCWPZWOUCDD

asd8532

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