printf函数讲解

 

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.

看了我的讲解应该懂了吧

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值