user-0 提问: 函数返回值问题。

回复:
user: user-1
content: 不客气，刚才又想了一下，我的第一个回答有些问题。 两个问题都是由于第2种解释引起的。

user: user-0
content: 引用 10 楼 mmns 的回复:另外，如果你的源文件是.c而不是.cpp,那么编译器也不会没有返回值而报错，而是扔出一个warning.因为标准的C语言编器可以容忍这个错误，而标准c++编译器不能。真是太感谢你了。我建立源文件的时候，在文件名上加上了.c

user: user-1
content: 另外，如果你的源文件是.c而不是.cpp,那么编译器也不会没有返回值而报错，而是扔出一个warning.因为标准的C语言编器可以容忍这个错误，而标准c++编译器不能。

user: user-1
content: 你的某个编译选项容忍了这种错误，具体哪个选项我记不清了，好久没用vc6了。不要深究这个了。 不过你的问题非常好，真是个美妙的巧合。

user: user-0
content: 引用 7 楼 mmns 的回复:[quote=引用 6 楼 zhudou_love 的回复:] [quote=引用 4 楼 mmns 的回复:] 问题出在这一句：printf("%d\n",max_zhu(a,b));  这行代码在调用printf之前，先调用了max_zhu(a,b)，max_zhu()会在栈中为z分配空间，然后那个地址会保存a和b中的最大值。 max_zhu(a,b)执行完以后，堆栈指针会移回原处，然后调用printf。 很凑巧，printf("%d\r\n", x);这个x在堆栈中的地址和max_zhu(a,b)函数中的变量z在堆栈中的位置正好重合。所以就把刚才max_zhu(a,b)执行过程中z的值输出来了。我把printf("%d\n",max_zhu(a,b));这句话改成 c = max_zhu(a,b); printf("%d\n",c); 为什么仍然能通过编译以及输出最大值呢？[/quote] 你用的应该是个特殊的编译器，一般的c编译器编译这段代码不能通过，对于某些特殊的编译器是可以的。 好吧，这个问题我就多说两句，对于以下的函数：  int max_zhu(int x , int y)  {    int z;    z = x>y?x:y;     return z;       /////注意这里，有返回值  } 一般编译器会把retuan z;这一句编译成 两句汇编 MOV EAX, z;  ///注意这是伪代码，就是说把栈中的内容移到寄存器EAX中。 RET          ///函数返回  而对于以下语句c = max_zhu(a, b); 编译器会处理为: CALL  max_zhu; ///伪代码，调用函数 MOV   c, eax;  ///伪代码，c指的是栈中的某个地址，实际的目标码应该适用堆栈指针寻址到c的地址  虽然你的函数没有返回值，即没把z的内容移到EAX中，但这里出现一个绝妙的巧合，很多编译器会用EAX来保留中间计算结果，你 max_zhu函数中的z = x>y?x:y; 恰好也适用eax保存x>y?x:y这个表达式计算的中间结果。 ok!你应该明白了，虽然你的max_zhu函数没有通过return z;的方式把返回值保存在eax中，但巧中之巧eax寄存器中放的正好是计算结果。 所以：在执行完 CALL  max_zhu; MOV   c, eax; 后，变量c中存的就是最大值了。 [/quote]你好，我还有个问题，我用的是VC++ 6.0编译器，群里有其他朋友用别机器上的VC6测试的时候为什么不能通过编译呢？

user: user-1
content: 引用 6 楼 zhudou_love 的回复:[quote=引用 4 楼 mmns 的回复:] 问题出在这一句：printf("%d\n",max_zhu(a,b));  这行代码在调用printf之前，先调用了max_zhu(a,b)，max_zhu()会在栈中为z分配空间，然后那个地址会保存a和b中的最大值。 max_zhu(a,b)执行完以后，堆栈指针会移回原处，然后调用printf。 很凑巧，printf("%d\r\n", x);这个x在堆栈中的地址和max_zhu(a,b)函数中的变量z在堆栈中的位置正好重合。所以就把刚才max_zhu(a,b)执行过程中z的值输出来了。我把printf("%d\n",max_zhu(a,b));这句话改成 c = max_zhu(a,b); printf("%d\n",c); 为什么仍然能通过编译以及输出最大值呢？[/quote] 你用的应该是个特殊的编译器，一般的c编译器编译这段代码不能通过，对于某些特殊的编译器是可以的。 好吧，这个问题我就多说两句，对于以下的函数：  int max_zhu(int x , int y)  {    int z;    z = x>y?x:y;     return z;       /////注意这里，有返回值  } 一般编译器会把retuan z;这一句编译成 两句汇编 MOV EAX, z;  ///注意这是伪代码，就是说把栈中的内容移到寄存器EAX中。 RET          ///函数返回  而对于以下语句c = max_zhu(a, b); 编译器会处理为: CALL  max_zhu; ///伪代码，调用函数 MOV   c, eax;  ///伪代码，c指的是栈中的某个地址，实际的目标码应该适用堆栈指针寻址到c的地址  虽然你的函数没有返回值，即没把z的内容移到EAX中，但这里出现一个绝妙的巧合，很多编译器会用EAX来保留中间计算结果，你 max_zhu函数中的z = x>y?x:y; 恰好也适用eax保存x>y?x:y这个表达式计算的中间结果。 ok!你应该明白了，虽然你的max_zhu函数没有通过return z;的方式把返回值保存在eax中，但巧中之巧eax寄存器中放的正好是计算结果。 所以：在执行完 CALL  max_zhu; MOV   c, eax; 后，变量c中存的就是最大值了。

user: user-0
content: 引用 4 楼 mmns 的回复:问题出在这一句：printf("%d\n",max_zhu(a,b));  这行代码在调用printf之前，先调用了max_zhu(a,b)，max_zhu()会在栈中为z分配空间，然后那个地址会保存a和b中的最大值。 max_zhu(a,b)执行完以后，堆栈指针会移回原处，然后调用printf。 很凑巧，printf("%d\r\n", x);这个x在堆栈中的地址和max_zhu(a,b)函数中的变量z在堆栈中的位置正好重合。所以就把刚才max_zhu(a,b)执行过程中z的值输出来了。我把printf("%d\n",max_zhu(a,b));这句话改成 c = max_zhu(a,b); printf("%d\n",c); 为什么仍然能通过编译以及输出最大值呢？

user: user-2
content: 这都能编译过，main不return个int就要出错，调用的居然还能不return

user: user-1
content: 问题出在这一句：printf("%d\n",max_zhu(a,b));  这行代码在调用printf之前，先调用了max_zhu(a,b)，max_zhu()会在栈中为z分配空间，然后那个地址会保存a和b中的最大值。 max_zhu(a,b)执行完以后，堆栈指针会移回原处，然后调用printf。 很凑巧，printf("%d\r\n", x);这个x在堆栈中的地址和max_zhu(a,b)函数中的变量z在堆栈中的位置正好重合。所以就把刚才max_zhu(a,b)执行过程中z的值输出来了。

user: user-0
content: 引用 2 楼 missheaven2011 的回复:属于不安全操作吧怎么个意思？

user: user-3
content: 属于不安全操作吧

user: user-4
content: 这相当的不科学