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