user-0 提问: 一段简短的代码，请教为什么子函数中的值输出了两次

回复:
user: user-1
content: 既然写了cout就不用写return，把返回改为void， 或者是把cout那句直接删掉。

user: user-2
content: 因为调用了aa()函数两次，所以输出3两次也算正常。但是输出的两次又在前面，应该是cout类似printf，参数压栈顺序是从右向左压栈，第二次调用aa()先执行，所以单独输出2次。 如果用d = aa();那么aa()函数执行了一次。

user: user-2
content: 引用 3 楼 wang001678 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 因为调用了aa()函数两次，所以输出3两次也算正常。但是输出的两次又在前面，应该是cout类似printf，参数压栈顺序是从右向左压栈，第二次调用aa()先执行，所以单独输出2次。 如果用d = aa();那么aa()函数执行了一次。 也就是说cout << a << "," << b << "," <<d<< endl;这句话在程序运行时先执行aa()的结果，也就是算出aa()后在屏幕上输出3，再执行在屏幕上连续输出123对吧[/quote] 压栈的顺序是这样的，先执行aa()函数，将返回值压入栈，然后继续将b,a依次压栈

user: user-3
content: 楼上打字打错了，应该是参数的求值顺序。

user: user-3
content: C++17后输出就变成 3 1,2,3 // 最后的3是aa()里输出的3 3 // aa()返回3，main()里的cout输出3 了，所以不要随意假定参数的输出顺序。

user: user-4
content: 是的  引用 5 楼 wang001678 的回复:[quote=引用 2 楼 turingo 的回复:]  cout << a << "," << b << "," << aa() << endl; /** 等价于 */ c = aa(); /** 这里打印3，并且返回3 */ cout << a << "," << b << "," << c << endl;   [quote=引用 楼主 wang001678 的回复:] 代码如下  #include "stdafx.h" #include <iostream> using namespace std; int a; int b; int d; int aa() { 	int c; 	a = 1; 	b = 2; 	c = a + b; 	cout << c << endl; 	return c; }   int main() {     aa(); 	cout << a << "," << b << "," << aa()<< endl; 	return 0; }  输出结果如图  其中3这个值被单独输出了两次 而如果加入变量d把主函数中代码改为d=aa()，3这个值就被单独输出一次，所以想请教为什么第一段代码中3单独输出了两次[/quote] 刚才回复的代码写错了输出流中d应该改为aa()， 也就是说cout << a << "," << b << "," <<aa()<< endl;这句话在程序运行时先执行aa()的结果，也就是算出aa()后在屏幕上输出3，再执行在屏幕上连续输出123对吧[/quote]

user: user-0
content: 引用 2 楼 turingo 的回复: cout << a << "," << b << "," << aa() << endl; /** 等价于 */ c = aa(); /** 这里打印3，并且返回3 */ cout << a << "," << b << "," << c << endl;   [quote=引用 楼主 wang001678 的回复:] 代码如下  #include "stdafx.h" #include <iostream> using namespace std; int a; int b; int d; int aa() { 	int c; 	a = 1; 	b = 2; 	c = a + b; 	cout << c << endl; 	return c; }   int main() {     aa(); 	cout << a << "," << b << "," << aa()<< endl; 	return 0; }  输出结果如图  其中3这个值被单独输出了两次 而如果加入变量d把主函数中代码改为d=aa()，3这个值就被单独输出一次，所以想请教为什么第一段代码中3单独输出了两次[/quote] 刚才回复的代码写错了输出流中d应该改为aa()， 也就是说cout << a << "," << b << "," <<aa()<< endl;这句话在程序运行时先执行aa()的结果，也就是算出aa()后在屏幕上输出3，再执行在屏幕上连续输出123对吧

user: user-0
content: 引用 2 楼 turingo 的回复: cout << a << "," << b << "," << aa() << endl; /** 等价于 */ c = aa(); /** 这里打印3，并且返回3 */ cout << a << "," << b << "," << c << endl;   [quote=引用 楼主 wang001678 的回复:] 代码如下  #include "stdafx.h" #include <iostream> using namespace std; int a; int b; int d; int aa() { 	int c; 	a = 1; 	b = 2; 	c = a + b; 	cout << c << endl; 	return c; }   int main() {     aa(); 	cout << a << "," << b << "," << aa()<< endl; 	return 0; }  输出结果如图  其中3这个值被单独输出了两次 而如果加入变量d把主函数中代码改为d=aa()，3这个值就被单独输出一次，所以想请教为什么第一段代码中3单独输出了两次[/quote] 也就是说cout << a << "," << b << "," <<d<< endl;这句话在程序运行时先执行aa()的结果，也就是算出aa()后在屏幕上输出3，再执行在屏幕上连续输出123对吧

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:因为调用了aa()函数两次，所以输出3两次也算正常。但是输出的两次又在前面，应该是cout类似printf，参数压栈顺序是从右向左压栈，第二次调用aa()先执行，所以单独输出2次。 如果用d = aa();那么aa()函数执行了一次。 也就是说cout << a << "," << b << "," <<d<< endl;这句话在程序运行时先执行aa()的结果，也就是算出aa()后在屏幕上输出3，再执行在屏幕上连续输出123对吧

user: user-4
content: cout << a << "," << b << "," << aa() << endl; /** 等价于 */ c = aa(); /** 这里打印3，并且返回3 */ cout << a << "," << b << "," << c << endl;  引用 楼主 wang001678 的回复:代码如下  #include "stdafx.h" #include <iostream> using namespace std; int a; int b; int d; int aa() { 	int c; 	a = 1; 	b = 2; 	c = a + b; 	cout << c << endl; 	return c; }   int main() {     aa(); 	cout << a << "," << b << "," << aa()<< endl; 	return 0; }  输出结果如图  其中3这个值被单独输出了两次 而如果加入变量d把主函数中代码改为d=aa()，3这个值就被单独输出一次，所以想请教为什么第一段代码中3单独输出了两次