你可能不知道的printf

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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            &nbs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值