栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【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:本人新手一枚,若大家发现错误,请指正!(一起进步)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019054.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号