在平时的编程中,我们经常使用printf函数进行输出,可以说printf函数真的和我们很熟悉了,但是printf函数也有很多神奇的地方,不知道你知道吗?
下面我们一起来看看吧!
一、函数基本介绍
printf()是C语言标准库函数,用于将格式化后的字符串输出到标准输出。标准输出,即标准输出文件,对应终端的屏幕。printf()申明于头文件stdio.h。
函数原型:
int printf ( const char * format, ... );
返回值:
正确返回输出的字符总数,错误返回负值,与此同时,输入输出流错误标志将被置值,可由指示器ferror来检查输入输出流的错误标志。调用格式:
printf()函数的调用格式为:printf(“格式化字符串”,输出表列)。格式化字符串包含三种对象,分别为:
(1)字符串常量;
(2)格式控制字符串;
(3)转义字符。- C中格式字符串的一般形式为: [标志][输出最小宽度][.精度][长度]类型。
其中方括号[]中的项为可选项。
二、printf函数的调用原理(变参函数的调用原理)
从函数原型我们就知道,printf函数是一个变参函数,下面我们将其调用原理展示出来,如下图:
在以后看到了类似于printf函数这样的变参函数时,我们都可以用这幅图本来帮助我们学习了!
三、几个坑!
有了上面的可变参数函数的调用原理,做下面的题就比较简单了,一起看看吧!
1.
#include <stdio.h>
int main()
{
int i = 43;
printf("%d\n", printf("%d", printf("%d", i)));
return 0;
}
- 输出结果:4321
因为:第一次输出的是43,“43”为两个字符,因此下一个为2,“2”是一个字符,因此为1。
扩展:如果输入的i为543,则输出结果就是54331了!
2.
#include <stdio.h>
int main(){
int i = 8;
printf("The raw value: i=%d\n", i);
printf("++i=%d \n++i=%d \n--i=%d \n--i=%d\n", ++i, ++i, --i, --i);
return 0;
}
输出结果:
The raw value: i=8
++i=8
++i=7
–i=6
–i=7原因如下:
注意:printf函数虽然是从右往左变化的,但是输出结果时,仍然从左往右。
3.
#include<stdio.h>
int main(){
int i = 8;
printf("%d\n%d\n%d\n%d\n%d\n%d\n", ++i, --i, i++, i--, -i++, -i--);
return 0;
}
输出结果:
8
7
7
8
-7
-8原因如下:
四、printf函数的缓冲
printf一般情况下,默认为行缓冲,遇到以下几种情况会刷新缓冲区,输出内容:
(1)缓冲区填满;
(2)写入的字符中有换行符\n或回车符\r;
(3)调用fflush手动刷新缓冲区;
(4)调用scanf要从输入缓冲区中读取数据时,也会将输出缓冲区内的数据刷新。