printf函数讲解
#include <stdio.h>/*辗转相除法求最大公约数*/
int gcd(int m, int n);
int factrial(int a);
int main(void){int m, n, t;scanf_s("%d %d", &m, &n);if (m < n){t = m;m = n;n = t;}//n = gcd(m, n);//printf("%d", n);printf("%d\n", factrial(3));while (true){}return 0;
}
int gcd(int m, int n){int r;r = m % n;if (r == 0){return n;}else{gcd(n, r);//855 225 //855%225=3。。。。180 //225%180=1。。。。45 //180%45=4}
}//printf函数 讲解int factrial(int a) { //传入参数a=3 递归调用你们说,怎么输出int product = 1;if (a == 1) {return product;}else {printf("a=%d\n", a);int p = factrial(a - 1);//a=2,f(1)=0,printf("p=%d\n", p);product = a * p;printf("product=%d\n", product);}
}
看到这个输出是不是很意外,为何p会等于10, product会等于30
else没有写return 语句,为啥不报错呢 ? 大家思考一下,我经过多番折腾,找大佬来帮忙看了下,才知道
这里就是这个printf函数作怪,因为printf函数和java的System.out.println是有很大区别的,在java里System.out.println只是在控制台打印输出,没有返回值。而c里面这么printf是有返回值的,返回整个字符串的长度,
我们来一步步分解printf函数,看看为啥会输出这个结果。
程序中的print函数是这样写的:printf("%d\n",printf("%d",printf("%d",i)));
一共有三个printf函数,我们可以使用一些代号来简化这个printf函数,如下:
代号A: printf("%d",printf("%d",i));
代号B: printf("%d",i)
则程序代码可以简化为:printf("%d\n",A); 那么我们就先来求A。
而A,又可以简化为:printf("%d",B);那么我们就先来求B。
B是 printf("%d",i),打印出“123”,即在运行结果中,你最先看到的是123。printf函数的返回值是printf实际控制输出的字符数,那么打印的123 就是3个字符,因此printf("%d",i)返回的就是3,也就是B是3,那么,A就可以写为printf("%d",printf("%d",3));打印出3,即在运行结果中,你紧接着会看到3。而打印出的3是1个字符,因此A就是1,那么printf("%d\n",A); 实际上就是printf("%d\n",1); 打印出1,即在运行结果中,你最后看到的就是1.
看了我的讲解应该懂了吧