你可能不知道的printf

本文详细探讨了printf函数的工作原理,包括可变参数中的类型提升、参数入栈顺序、浮点数的有效位、可变域宽和精度以及格式控制符的处理方式。通过示例程序分析了printf的常见疑问,强调了格式控制符与参数类型匹配的重要性,提醒程序员避免出现与计算顺序有关的代码,并介绍了printf不会接受char、short和float类型参数的事实。
摘要由CSDN通过智能技术生成

前言

printf可能是我们在学习C语言的过程中最早接触的库函数了。其基本使用想必我们都已经非常清楚了。但是下面的这些情况你是否已经清楚地知道了呢?

示例程序

我们来看一个示例程序,看看你能否对下面的结果输出有非常清晰的认识。

#include <stdio.h>
int main(void)
{
    int a = 4;
    int b = 3;
    int c = a/b;
    float d =  *(float*)(&c);
    long long e = 0xffffffffffffffff;
    printf("a/b:%f,a:%d\n",a/b,a,b);          //打印0

    printf("(float)a/b:%f\n",((float)a)/b);   //打印1

    printf("(double)a/b:%lf\n",((double)a)/b);//打印2

    printf("d:%f\n",d);                       //打印3

    printf("%.*f\n",20,(double)a/b);          //打印4

    printf("e:%d,a:%d\n",e,a);                //打印5

    printf("a:%d,++a:%d,a++:%d\n",a,++a,a++); //打印6

    return 0;
}

编译为32位程序:

gcc -m32 -o test test.c

在运行之前,你可以自己先猜想一下打印结果会是什么。实际运行结果:

a/b:0.000000,a:3        //打印0的结果
(float)a/b:1.333333      //打印1的结果
(double)a/b:1.333333     //打印2的结果
d:0.000000               //打印3的结果
1.33333333333333325932   //打印4的结果
e:-1,a:-1                //打印5的结果
a:6,++a:6,a++:4          //打印6的结果

你的猜想是否都正确呢?如果猜想错误,那么接下来的内容你就不应该错过了。

你是否会有以下疑问:

  • 0.打印0的a/b为什么不是1,a为什么不是4?

  • 1.打印1和打印2有什么区别呢?

  • 2.打印3为什么结果会是0.000000?

  • 3.打印4的结果为什么最后的小数位不对?其中的*是什么意思?

  • 4.打印5中,为什么a的值是-1而不是4?

  • 5.打印6中,结果为什么分别是6,6,4?

在解答这些问题之前,我们需要先了解一些基本内容。

可变参数中的类型提升

printf是接受变长参数的函数,传入pr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值