关于printf()函数的压栈与返回值问题——精解

一.printf()函数的压栈规则:

printf函数的压栈顺序是从右到左压栈,我们可以理解为计算的顺序为从右到左。
我们先给出一段代码:

#include<stdio。h>
int main()
{
	int i=10;
	int j=10;
	printf("%d %d %d",i++,++i,j++);
	return 0;
}

我们单独将printf("%d %d %d",i++,++i,j++);这行代码提取出来分析:
首先我们根据从右到左的压栈顺序得知,应先分别计算 j++,++i,i++。
如图:

在这里插入图片描述
(1)首先计算 j++:根据“先使用,后加一”的原则,即先使用 j 的值作为输出值(先使用),即输出值为10,然后再加一得到计算后的 j 为11(后加一)

(2)然后计算 ++i:根据“先加一,后使用”的原则,即先加一得到计算后的 i 为11(先加一),此时暂时不使用 i 的值作为输出值(后使用)

(3)接着计算 i++:根据“先使用,后加一”的原则,即先使用 i 的值作为输出值,即输出值为11(先使用),然后再加一得到计算后的 i 为12(后加一)

(4)最后再使用 i 的值作为 ++i 的输出值,即++i 的输出值为12(这一步理解为(2)的后使用)

在这里插入图片描述
程序运行结果:

在这里插入图片描述
我们再给出一段代码:

#include<stdio.h>
int main()
{
	int a=10;
	printf("%d %d %d %d %d %d\n",a++, ++a, a++, ++a, a++, ++a );
	return 0;
}

根据从右到左的压栈顺序规以及上述计算方法得:
在这里插入图片描述
在这里插入图片描述
程序运行结果:

在这里插入图片描述

二.printf()函数的返回值:

printf()函数若为真,则返回值为写入字符的总个数,包括数字,字符,特殊符号,空格以及功能符(例如换行符\n)。
我们先给出一段代码:

#include<stdio.h>
int main()
{
	printf("%d\n",printf("0123"));
	return 0;
}

我们单独将printf("%d\n",printf(“0123”));这行代码提取出来分析,由printf()函数的压栈规则可知,它的计算顺序为从右到左,所以它先输出0123,接着printf(“0123”)将返回它写入字符的总个数, ‘0’ ‘1’ ‘2’ '3’一共为4个字符,即返回值为4,接着这个4将赋值给前面的%d,即最终的输出结果为 01234。
程序运行结果:

在这里插入图片描述
或者我们可以这样理解:

#include<stdio.h>
int main()
{
	int n=printf("0123");
	printf("%d\n",n);
	return 0;
}

程序运行结果:
在这里插入图片描述


下面我们来做一个小练习题:
在这里插入图片描述
首先按照压栈的规则可知程序将先输出 hello! 并且换行,由计算可知“hello!\n”一共包括了7个字符,接着7将赋值给中间的%d,然后程序会打印数字7并且换行,接着由计算可知“%d\n”(这里的%d其实就是7)一共包含了2个字符,接着2将赋值给最左面的%d,最后程序会打印数字2并且换行。

程序运行结果:
在这里插入图片描述
其实这段程序还可以写为:

#include<stdio.h>
int main()
{
	int n=printf("hello!\n");
	int m=printf("%d\n",n);
	printf("%d\n",m);
	return 0;
}

程序运行结果为:
在这里插入图片描述
希望这些解答可以帮助到你。

猜你喜欢

转载自blog.csdn.net/ThinPikachu/article/details/88550313