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.
看了我的讲解应该懂了吧