当前位置: 首页 > news >正文

printf函数参数与入栈顺序

01. printf()的核心功能

作用:将 格式化数据 输出到 标准输出(stdout),支持多种数据类型和格式控制。

在这里插入图片描述

int printf(const char *format, ...);
  • 参数
    • format:格式字符串,字符串或%开头格式符
    • ...:可变参数,与" "内格式一一对应
  • 返回值:成功返回输出的字符数,失败返回负数

eg:

int count = printf("Hello, %s!\n", "World");
printf("输出了 %d 个字符\n", count); // 输出:输出了 13 个字符

02. printf()格式说明符

常用格式符

格式符数据类型示例
%dintprintf(“%d”, 66);
%uunsigned intprintf(“%u”, 66);
%ffloat/doubleprintf(“%.2f”, 6.666);
%ccharprintf(“%c”, ‘A’);
%s字符串printf(“%s”, “hello world”);
%p指针地址printf(“%p”, &x);
%zusize_tprintf(“%zu”, 100);
%x十六进制整数printf(“%x”, 66);

格式控制

默认右对齐,使用-可左对齐输出。%m.ns表示向右对齐占m列,左边不足补空格,输出字符只占n位,超出n位删去。同理%m.nf亦是如此。

  • 填充与对齐

    printf("%5d", 10);    //  "   10"。从右开始输出,不足处补空格
    printf("%-5d", 10);   //  "10   "。从左开始输出,不足处补空格
    printf("%05d", 7);    //  "00007"。从右开始输出,不足处补0
    
  • 精度控制

    printf("%.3f", 3.14159); //  "3.142"。保留3位小数
    printf("%.6s", "hello world"); // 输出前6个字符 "hello "
    

03. printf() 的参数入栈顺序

C标准未规定参数求值顺序。大多数编译(GCC、Clang)默认从右往左入栈顺序,这样可以支持…可变参数。这里讨论常见情况。

注意: 不同编译器可能出现不同的结果。

示例代码

int i = 1;
printf("%d, %d, %d\n", i++, i++, i++);
//GCC 一般情况输出  3, 2, 1

验证入栈顺序:

在这里插入图片描述
Linux下:
在这里插入图片描述

&a > &b > &c 符合栈的生长方向。

  • 参数入栈顺序:从右到左(c→b→a→格式串),但 64位系统优先用寄存器(前6个参数通过 rdi, rsi, rdx, rcx, r8, r9 传递)。
  • 参数访问顺序printf 按格式字符串的 % 顺序 从左到右 从寄存器或栈中读取参数。

参数传递:

  • rdi = 格式字符串地址
  • rsi = a 的值 (10)
  • rdx = b 的值 (20)
  • rcx = c 的值 (30)

输出顺序
printf%p 顺序读取 rsi→rdx→rcx,因此输出 &a, &b, &c

在这里插入图片描述

03. printf()输出流程

程序 内存缓冲区 标准输出(stdout) printf 屏幕 调用printf("Value: %d", 42)无`\0` 格式化字符串并写入缓冲区 满足条件时刷新(如缓冲区满、遇到\n) 显示"Value: 42" 程序 内存缓冲区 标准输出(stdout) printf 屏幕

04. 缓冲区机制

  • 行缓冲:默认模式(终端输出),遇到 \n 或缓冲区满时刷新。
  • 全缓冲:文件输出,缓冲区满或调用 fflush 时刷新。
  • 无缓冲:如 stderr,立即输出。

2. 强制刷新示例

printf("Processing...");  // 无换行符,行缓冲下不会立即显示
fflush(stdout);           // 强制刷新到屏幕

相关文章:

  • 阿克曼-幻宇机器人系列教程4- 建图
  • C 语言字符串输出与长度计算:掌握 puts, fputs 和 strlen
  • ControlNet简洁
  • LeetCode 每日一题 2025/5/12-2025/5/18
  • 深入浅出知识图谱
  • GO语言语法---switch语句
  • 某狗开源版,MoeKoeMusic某狗第三方,自动领会员
  • Python多进程、多线程、协程典型示例解析
  • 谷歌地球引擎GEE将多个遥感影像作为多个波段合并成一张图像并下载的方法
  • socc19 echash部分代码讲解 二 hashtable
  • 基于JAVA springboot+mybatis 电商书城平台系统设计和实现
  • 【数字电路】第七章 脉冲波形的产生与整形电路
  • 高压BOOST芯片-TPQ80302
  • Java微基准测试工具JMH
  • inverse-design-of-grating-coupler-3d
  • el-scrollbar 获取滚动条高度 并将滚动条保持在低端
  • Vue 3.0 中的slot及使用场景
  • 【Odoo】Pycharm导入运行Odoo15
  • LOF算法(局部异常因子)python实现代码
  • 自适应Prompt技术:让LLM精准理解用户意图的进阶策略
  • 完善劳动关系协商协调机制,《共同保障劳动者合法权益工作指引》发布
  • 人民日报头版:紧盯“学查改”,推动作风建设走深走实
  • 人民日报评论员:党政机关要带头过紧日子
  • 商务部:对原产于美国、欧盟、台湾地区和日本的进口共聚聚甲醛征收反倾销税
  • 四大皆空!赛季还没结束,曼城已经吃上“散伙饭”了
  • 家国万里·时光故事会|构筑中国船舰钢筋铁骨,她在焊花里展现工匠风范