【c语言题目】由此引发的思考

printf函数中的工作以及函数返回值


问题描述

KiKi写了一个输出“Hello world!”的程序,BoBo老师告诉他printf函数有返回值,你能帮他写个程序输出printf(“Hello world!”)的返回值吗?
输入描述:

输出描述:
包括两行:
第一行为“Hello world!”
第二行为printf(“Hello world!”)调用后的返回值。

printf("%d",printf("Hello world!\n"));

以上是我一开始写的代码,它是错误的,


原因分析:

那代码为什么是错误的呢?

因为printf返回值是输出的字符个数,当然\n也是其中一个。返回值永远大1
我下意识忽略了它才会造成错误


解决方案:

printf("\n%d",printf("Hello world!"));正确

那么为什么对呢?

这就要从printf的工作原理解释了:
printf是从左向右读取的,把先读取到的放到栈底,最后读取放到栈顶,处理的时候是从栈顶开始处理的,所以我们看到的是先打印hello world!再打印换行符,在打印printf返回值

由此我上网搜了一道题:

int arr[] = {11, 12, 13, 14, 15};
int* p = arr;
*(++p) += 100;
 printf("%d %d",*p, *p++);    //结果是13 112

解释:

arr是数组首元素地址所以开始p指向arr[0]++p:给p+1,p指向了arr[1],又因为a+=1操作符不同于a = a + 1;前者a执行一次后者a执行两次,所以把该表达式解释为:arr[1] += 100; arr[1] = 112
*p++:先执行*p,再给p+1,p指向了arr[2];
所以打印的*p变成了arr[2] = 13; 

ps:本人新手一枚,若大家发现错误,请指正!(一起进步)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值