为了账号安全,请及时绑定邮箱和手机立即绑定

递归的输出问题

递归的输出问题

C C++
心雨翎馨 2017-03-17 21:01:49
#include<stdio.h>int fun(int m,int n){      if(n==0)        return m;     printf("     qwef\n");    fun(n,m%n);    printf("    xvb\n");}void main(){    int m=45,n=15;    printf("%d",fun(m,n));}这样的输出结果就是     qwef    xvb8如果改变数中第二个printf则#include<stdio.h>int fun(int m,int n){      if(n==0)        return m;     printf("     qwef\n");    fun(n,m%n);    printf("   127587825\n");}void main(){    int m=45,n=15;    printf("%d",fun(m,n));}这样的输出结果就是     qwef   12758782513为什么会这样?我只是改变了一个输出语句,为什么会对函数的返回值产生影响?
查看完整描述

3 回答

?
朕日理万机

TA贡献27条经验 获得超28个赞

对不起前面说错了,原因是在于fun函数只有n==0会返回确定的值,在n!=0的时候没有指定返回值,导致了未定义行为。

查看完整回答
反对 回复 2017-03-19
?
朕日理万机

TA贡献27条经验 获得超28个赞

两次运行都会递归到fun(15,0)。然后到15%0,对0取余是未定义的行为,和除0是一样的。编译器可能会给出警告,但不仍然会通过。所以每次运行可能都会有不同的值,不是你输出语句造成的。

查看完整回答
反对 回复 2017-03-18
  • 心雨翎馨
    心雨翎馨
    不是很懂,能不能说清楚点
  • 心雨翎馨
    心雨翎馨
    可是如果我去掉函数中第二个printf语句,无论怎么运行结果都不会变化、
  • 朕日理万机
    朕日理万机
    像15%0这个操作,运行结果不是确定的,不能控制,不能预料。哪怕你目前运行多次结果都一样,但不保证换个机器,换个编译器,重新编译运行,还能得到同样的结果。所以不管你是改了输出语句,还是稍微改下代码,在之前定义几个int i, j, k等没用的变量,都会对结果有影响,而且怎么影响不知道。不像15-0怎么算都是15
  • 3 回答
  • 0 关注
  • 1521 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信