printf函数参数与入栈顺序

news2025/5/19 8:01:32

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);           // 强制刷新到屏幕

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2379136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

仿生眼机器人(人脸跟踪版)系列之一

文章不介绍具体参数,有需求可去网上搜索。 特别声明:不论年龄,不看学历。既然你对这个领域的东西感兴趣,就应该不断培养自己提出问题、思考问题、探索答案的能力。 提出问题:提出问题时,应说明是哪款产品&a…

Go语言语法---输入控制

文章目录 1. fmt包读取输入1.1. 读取单个值1.2. 读取多个值 2. 格式化输入控制 在Go语言中,控制输入主要涉及从标准输入(键盘)或文件等来源读取数据。以下是几种常见的输入控制方法: 1. fmt包读取输入 fmt包中的Scan和Scanln函数都可以读取输入&#xf…

CSS- 4.3 绝对定位(position: absolute)学校官网导航栏实例

本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 HTML系列文章 已经收录在前端专栏,有需要的宝宝们可以点击前端专栏查看! 点…

Seata源码—6.Seata AT模式的数据源代理一

大纲 1.Seata的Resource资源接口源码 2.Seata数据源连接池代理的实现源码 3.Client向Server发起注册RM的源码 4.Client向Server注册RM时的交互源码 5.数据源连接代理与SQL句柄代理的初始化源码 6.Seata基于SQL句柄代理执行SQL的源码 7.执行SQL语句前取消自动提交事务的源…

计算机科技笔记: 容错计算机设计05 n模冗余系统 TMR 三模冗余系统

NMR(N-Modular Redundancy,N 模冗余)是一种通用的容错设计架构,通过引入 N 个冗余模块(N ≥ 3 且为奇数),并采用多数投票机制,来提升系统的容错能力与可靠性。单个模块如果可靠性小于…

Spring Boot 与 RabbitMQ 的深度集成实践(一)

引言 ** 在当今的分布式系统架构中,随着业务复杂度的不断提升以及系统规模的持续扩张,如何实现系统组件之间高效、可靠的通信成为了关键问题。消息队列作为一种重要的中间件技术,应运而生并发挥着举足轻重的作用。 消息队列的核心价值在于其…

黑马程序员2024新版C++笔记 第2章 语句

1.if逻辑判断语句 语法主体: if(要执行的判断,结果是bool型){判断结果是true会执行的代码; } 2.AI大模型辅助编程 在Clion中搜索并安装对应插件: 右上角齿轮点击后找到插件(TRONGYI LINGMA和IFLYCODE)安装后重启ide即可。 重启后会有通义登…

前端动画库 Anime.js 的V4 版本,兼容 Vue、React

前端动画库 Anime.js 更新了 V4 版本,并对其官网进行了全面更新,增加了许多令人惊艳的效果,尤其是时间轴动画效果,让开发者可以更精确地控制动画节奏。 这一版本的发布不仅带来了全新的模块化 API 和显著的性能提升,还…

用 PyTorch 从零实现简易GPT(Transformer 模型)

用 PyTorch 从零实现简易GPT(Transformer 模型) 本文将结合示例代码,通俗易懂地拆解大模型(Transformer)从数据预处理到推理预测的核心组件与流程,并通过 Mermaid 流程图直观展示整体架构。文章结构分为四…

【通用大模型】Serper API 详解:搜索引擎数据获取的核心工具

Serper API 详解:搜索引擎数据获取的核心工具 一、Serper API 的定义与核心功能二、技术架构与核心优势2.1 技术实现原理2.2 对比传统方案的突破性优势 三、典型应用场景与代码示例3.1 SEO 监控系统3.2 竞品广告分析 四、使用成本与配额策略五、开发者注意事项六、替…

Spring3+Vue3项目中的知识点——JWT

全称:JOSN Web Token 定义了一种简洁的、自包含的格式,用于通信双方以json数据格式的安全传输信息 组成: 第一部分:Header(头),记录令牌类型、签名算法等。 第二部分:Payload&am…

python3GUI--智慧交通分析平台:By:PyQt5+YOLOv8(详细介绍)

文章目录 一.前言二.效果预览1.目标识别与检测2.可视化展示1.车流量统计2. 目标类别占比3. 拥堵情况展示4.目标数量可视化 3.控制台4.核心内容区1.目标检测参数2.帧转QPixmap3.数据管理 5.项目结构 三.总结 平台规定gif最大5M,所以…

Linux任务管理与守护进程

一、任务管理 (一)进程组、作业、会话概念 (1)进程组概念:进程组是由一个或多个进程组成的集合,这些进程在某些方面具有关联性。在操作系统中,进程组是用于对进程进行分组管理的一种机制。每个…

C#里与嵌入式系统W5500网络通讯(2)

在嵌入式代码里,需要从嵌入式的MCU访问W5500芯片。 这个是通过SPI通讯来实现的,所以要先连接SPI的硬件通讯线路。 接着下来,就是怎么样访问这个芯片了。 要访问这个芯片,需要通过SPI来发送数据,而发送数据又要有一定的约定格式, 于是芯片厂商就定义下面的通讯格式: …

EMQX开源版安装指南:Linux/Windows全攻略

EMQX开源版安装教程-linux/windows 因最近自己需要使用MQTT,需要搭建一个MQTT服务器,所以想到了很久以前用到的EMQX。但是当时的EMQX使用的是开源版的,在官网可以直接下载。而现在再次打开官网时发现怎么也找不大开源版本了,所以…

【计算机视觉】OpenCV实战项目:GraspPicture 项目深度解析:基于图像分割的抓取点检测系统

GraspPicture 项目深度解析:基于图像分割的抓取点检测系统 一、项目概述项目特点 二、项目运行方式与执行步骤(一)环境准备(二)项目结构(三)执行步骤 三、重要逻辑代码解析(一&#…

MySQL 数据库备份与还原

作者:IvanCodes 日期:2025年5月18日 专栏:MySQL教程 思维导图 备份 (Backup) 与 冗余 (Redundancy) 的核心区别: 🎯 备份是指创建数据的副本并将其存储在不同位置或介质,主要目的是在发生数据丢失、损坏或逻辑错误时进…

Kubernetes控制平面组件:Kubelet详解(四):gRPC 与 CRI gRPC实现

云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…

javax.servlet.Filter 介绍-笔记

1.javax.servlet.Filter 简介 javax.servlet.Filter 是 Java Servlet API 中的一个核心接口,用于在请求到达目标资源(如 Servlet 或 JSP)之前或响应返回给客户端之前执行预处理或后处理操作。它常用于实现与业务逻辑无关的通用功能&#xff…

Win 11开始菜单图标变成白色怎么办?

在使用windows 11的过程中,有时候开始菜单的某些程序图标变成白色的文件形式,但是程序可以正常打开,这个如何解决呢? 这通常是由于快捷方式出了问题,下面跟着操作步骤来解决吧。 1、右键有问题的软件,打开…