user-0 提问: 已初始化的变量a=1;然后a=m(1);但m并没有返回值，a为什么就变成未未知的了；

回复:
user: user-1
content: 汇编是硬道理！！！！

user: user-2
content: 引用 10 楼 ACMtop 的回复:[quote=引用 8 楼 dbzhang800 的回复:] [quote=引用 7 楼 ACMtop 的回复:] [quote=引用 5 楼 mymtom 的回复:]   #include<stdio.h>   int m(int a) {     if(a==1)         return 2;      printf("return %d\n", 9); }   int main(void) {     int min ;     min=3;     min=m(2);     printf("min=%d\n",min); }   为什么加了printf("return %d\n", 9);就有数值了什么情况[/quote]  建议你学学汇编，然后你就容易理解 函数调用时，究竟发生了什么了。不然，你就规规矩矩地写程序。[/quote]  汇编果然是道砍，寄存器变来变去搞不清，看来还是老实写程序了[/quote] 一开始也不明白，后来通过调试发现函数的返回值癌变的 是保存在EAX寄存器中的，而printf函数会改变EAX寄存器中的值，而改变的值等于printf输出的字符长度（注：\n也算一个字符）

user: user-3
content: 不解释

user: user-4
content: 函数m根本没有返回值，因为你传的是2，函数根本没有返回，也就是没有写AX的值，你得到的当然是假的了。

user: user-5
content: 截图没完整

user: user-5
content: x86/linux/gcc平台 gcc  -g  min.c  -o min  objdump -dS min

user: user-5

user: user-6
content: 2楼说的是对的。。。 没写返回值不代表函数不返回值 汇编 m函数返回值是放在eax寄存器里面 那为什么会返回9呢，并不是因为printf("return %d\n", 9);输出的是9 而是因为printf打印了9个字符，printf函数返回了9，存在了eax寄存器 m函数没有修改eax的值，然后实际上作为自己的返回值返回给main函数 这也就是为什么min最后为9。。。

user: user-0
content: 引用 8 楼 dbzhang800 的回复:[quote=引用 7 楼 ACMtop 的回复:] [quote=引用 5 楼 mymtom 的回复:]   #include<stdio.h>   int m(int a) {     if(a==1)         return 2;      printf("return %d\n", 9); }   int main(void) {     int min ;     min=3;     min=m(2);     printf("min=%d\n",min); }   为什么加了printf("return %d\n", 9);就有数值了什么情况[/quote]  建议你学学汇编，然后你就容易理解 函数调用时，究竟发生了什么了。不然，你就规规矩矩地写程序。[/quote]  汇编果然是道砍，寄存器变来变去搞不清，看来还是老实写程序了

user: user-0
content: 引用 4 楼 a345485527 的回复:gcc加上-Wall参数 gcc -Wall test.c  看看给你的是什么警告 warning: control reaches end of non-void function 就是说你的一些本应带有返回值的函数到达结尾后可能并没有返回任何值 没用gcc，按理说应该还是原值才对

user: user-7
content: 引用 7 楼 ACMtop 的回复:[quote=引用 5 楼 mymtom 的回复:]   #include<stdio.h>   int m(int a) {     if(a==1)         return 2;      printf("return %d\n", 9); }   int main(void) {     int min ;     min=3;     min=m(2);     printf("min=%d\n",min); }   为什么加了printf("return %d\n", 9);就有数值了什么情况[/quote]  建议你学学汇编，然后你就容易理解 函数调用时，究竟发生了什么了。不然，你就规规矩矩地写程序。

user: user-0
content: 引用 5 楼 mymtom 的回复:  #include<stdio.h>   int m(int a) {     if(a==1)         return 2;      printf("return %d\n", 9); }   int main(void) {     int min ;     min=3;     min=m(2);     printf("min=%d\n",min); }   为什么加了printf("return %d\n", 9);就有数值了什么情况

user: user-8
content: m函数中无默认返回值，编译不报错？

user: user-9
content: #include<stdio.h>   int m(int a) {     if(a==1)         return 2;      printf("return %d\n", 9); }   int main(void) {     int min ;     min=3;     min=m(2);     printf("min=%d\n",min); }

user: user-10
content: gcc加上-Wall参数 gcc -Wall test.c  看看给你的是什么警告 warning: control reaches end of non-void function 就是说你的一些本应带有返回值的函数到达结尾后可能并没有返回任何值

user: user-7
content: 首先你的m函数有问题，在有问题代码的基础上讨论其他问题是没有意义的。  你的m函数返回值是一个int，不管你的代码中有没有return。没有return时，返回的是不受你控制的随机值。

user: user-11
content: 变成eax的值了。 16位环境下变成ax的值。  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-12
content: int 函数有点不对，if .... return 2,那另一个分支总的写吧，而且if(a==1)，不是赋值，是判断a是否等于1，楼主看书不仔细！  你在main里面,min = m(2), 不符合int 函数里面的判断

user: user-13
content: 返回值未定义。可以是任何值，也可能任何值都不是。那么发生神马事情都有可能。

user: user-14
content: m不是没有返回值 而是返回值无法确定