1.我觉得还是调用函数时的压栈问题。。函数调用的时候会创建堆栈来传递参数和访问局部变量等,当函数运行完后很多局部的变量什么都会被销毁,而当这个函数有返回值的时候,在销毁之前,会把返回值的地址压入栈中,然后把变量的值赋给该地址,然后回到上一个函数中,将栈中的变量弹出赋给对应的值。。。
2
. 因为版主的子函数不是每个路径都存在着返回值。。而那个函数又是有返回值的函数。。。这时候就会遇到问题了。。
加上版主用的是函数的递归调用。。也就只有最里面的那次函数调用有一个返回值 1234。。而到了最外层函数的时候,运行到最后时有一个printf函数。。因为printf函数是有返回值的。。如一开始所说,它会创建一个栈来储存返回值的地址。。接着便是two_ten函数销毁,虽然two_ten函数本身应该是有返回值的,但因为2(见上面的2)的原因最后没有return值,而返回到主函数的时候,又有 n = two_ten(a), 这条语句就很自然地让编译器从函数返回值创建的栈中找。。因为上述原因。。也就很自然地找到prtinf那个函数创建的栈中找到其返回值赋给 n,这就解释了为什么会输出 11.。。
然后m456m654版主说printf和递归语句two_ten(a+1);换下位置就好了。。这是因为printf函数是先执行。。最后执行的函数就是递归时最里层的那个return 1234,也就是这个函数唯一的一次返回值。。而返回到主函数的时候, n = two_ten(a), 编译器从函数返回值创建的栈中找。。便找到了 1234对应的那个栈。。于是非常正确地输出了 1234.。。
然后版主把函数返回值的类型换了。。换了之后后出现什么呢??因为 printf返回值是int 而two_ten返回值不是整型的话。。
继续看它们的执行情况。。。程序进入递归后就递归递归。。到最里面的时候。。有返回值 。。。创建一个栈。。压入值。。然后往外出去的时候不断的执行printf函数 。。。
注意。。此时刚刚建的储存 那个最里层返回值的栈已经被销毁了。。然后到了递归的归外层。。执行最后 一个printf函数 。。将它输出的字符的个数(int型)压入创建好的栈中。。结束递归。。。又回到了主函数中。。执行n = two_ten(a),编译器从函数返回值创建的栈中找。。此时虽然存在一个储存返回值的栈。。但因为地址的类型不同(也可以说是储存的返回值的类型不同)。。不能读取。。但是也找不其它的栈了。。。。于是··输出找不到。。因为没有值。。
所以赋给 n 的也就是' nan'(not a number,不是一个数)
这个意思不同编译器有不同的表达方法。。大概就那个意思。。
------------------
个人薄见,有不对的地方海涵和指正