printf函数你不知道的那点事!

在平时的编程中,我们经常使用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要从输入缓冲区中读取数据时,也会将输出缓冲区内的数据刷新。

猜你喜欢

转载自blog.csdn.net/cherrydreamsover/article/details/81429396