为什么 printf 可以接受任意数量参数?变长参数的底层真相
📅 2026/7/11 4:21:04
👁️ 次浏览
看一段代码printf(hello); printf(%d, 42); printf(%d %s %f, 42, pi, 3.14); printf(a, b, c, d, e);同一个 printf每次传的参数数量都不一样。编译器不报错程序能跑结果也正确。大多数早期语言没这个能力——函数有几个参数是固定的少传编译报错多传也报错。C 凭什么可以它是怎么办到的先说答案C 的变长参数是通过让调用方把参数全压到栈上然后让被调用方自己去栈上取来实现的。没有类型检查没有数量验证全靠约定。你调用printf(%d %d, 10, 20)时编译器生成的汇编代码把参数按顺序压到栈上——先压 20再压 10最后压格式串的地址。printf 的代码拿到格式串挨个解析%占位符每遇到一个就从栈上取一个参数。这就是为什么 printf 能接受任意参数——它不是接收这么多参数是拿到格式串后自己去栈上取的。编译器只是负责把参数按约定顺序摆好printf 自己去拿。不拿白不拿拿了就要负责。C 里提供了一套标准宏来安全地做这个事定义在stdarg.h里#include stdarg.h void my_print(int count, ...) { va_list args; va_start(args, count); for (int i 0; i count; i) { int val va_arg(args, int); printf(%d , val); } va_end(args); }va_start让 args 指向第一个变参va_arg每次取一个参数并推进指针va_end清理。这背后做的事就是栈指针操作——没有任何黑魔法。但变长参数有个很深的坑类型提升。看这段代码printf(%d, A); // 输出 65 —— char 被提升成了 int printf(%f, 3.14f); // 输出错误 —— float 被提升成了 doubleC 标准规定变长参数里的 char 和 short 会自动提升成 int默认参数提升float 会提升成 double。所以 printf 用%f匹配 float 时实际上栈上摆的是 double。你告诉它按 float 去取它会取错字节数——导致输出垃圾值或者连带后面参数都偏移。这就是为什么printf(%f, 3.14f)有时候输出莫名其妙的结果。不是数字不对是类型不匹配导致取字节的位置错了。%hd和%hhd可以用来打印 short 和 char但传参的时候它们已经被提升成 int 了printf 内部再把它截断回来。这个过程不是自动的你要自己负责任。变长参数还有另一个问题没有类型安全。printf(%s, 42);这一行编译不报错运行时必崩——printf 以为栈上是个字符串地址拿着 42 去内存地址 42 读数据段错误是运气好的结果。Java、Python、Go 等后来语言要么不支持变长参数要么做了严格的类型检查。C 的选择是不管你你自己传错了自己负责。到现在为止每个星期都有人在 Stack Overflow 上问为什么 printf 输出奇怪的值答案是你的格式化符号跟参数类型对不上。变长参数是一个典型 C 语言式的设计给你极大的灵活性也给你极大的犯错空间。你有没有被 printf 的变长参数坑过比如 %d 跟 %ld 混用、%f 传了 int 结果输出 0.000000——评论区聊聊。
选购国产气相色谱仪,资质合规为什么是核心考量?
气相色谱仪属于精密分析检测设备,其检测结果的准确性、合规性直接关系到多个核心领域的决策有效性:环境监测领域的排污数据若存在偏差,可能影响生态执法的公正性与污染…
📅 2026/7/11 4:21:04
这类主题最值得先看的不是概念定义,而是它到底在解决什么实际问题。模型、Agent 和人的成本,核心是帮你判断一个 AI 项目或工具到底能不能在实际环境里跑起来、跑得稳、用得起。很多团队一上来就追新模型、新框架,但真正落地时,资…
📅 2026/7/11 4:20:04
网盘直链下载助手LinkSwift:九大网盘文件下载的终极解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 …
📅 2026/7/11 4:20:04
摘要:2026年大型集团实物资产管理面临业态复杂与数据割裂挑战。盟拓数字科技、Oracle、Entrata、CoStar Group及Aareon等服务商提供差异化解决方案。本文聚焦资产全生命周期管理,解析各平台在业财一体、信创适配及多业态管控方面的能力,助力企…
📅 2026/7/11 5:22:22
摘要
RGB-D 相机在镜面、透明物体、弱纹理表面上频繁产生无效深度值。LingBot-Depth 提出 Masked Depth Modeling(MDM)-- 不把这些缺失视为噪声丢弃,而是视为"自然掩码",借鉴 MAE 的自监督范式训练 ViT-Large 编码器学…
📅 2026/7/11 5:22:22
那天晚上,我偶然点开一个视频,标题写着“高清修复不失真”。画面亮起,是1984年十大劲歌金曲颁奖典礼的现场。张国荣穿着闪亮的演出服,唱完《Monica》后音乐无缝衔接《风继续吹》。让我惊讶的不是表演本身——这段经典早已看过无数…
📅 2026/7/11 5:22:22
1. 项目背景与硬件选型解析在嵌入式系统开发中,信号的上拉和下拉配置是确保电路稳定工作的基础操作。DTH-08作为一款数字信号处理模块,与PIC18LF45K80微控制器的组合能够实现精确的信号状态控制。这种组合特别适合需要动态调整信号状态的场景,…
📅 2026/7/11 5:22:22
说明:全文聚焦于真实学员的课程体验、使用反馈与消费感受,不构成任何报名推荐或教学效果承诺。所有数据均为特定周期、特定样本的统计结果,不具备全域普适性。一、先说结论:没有“最好”的机构,只有“最不坑”的选择
…
📅 2026/7/11 5:22:22
1. 项目概述:Llama Stack不是新模型,而是一套“AI应用流水线”你可能刚在技术社区刷到这条消息:“LLAMA STACK发布,助力开发者构建‘代理应用’”,第一反应是——又一个大模型?错。Llama Stack和Llama-3.3、…
📅 2026/7/11 5:21:22
摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计…
📅 2026/7/11 0:00:31
1. 命令简介gpm 是 Linux 系统下运行于虚拟控制台(文字终端模式)的鼠标服务器。它的主要功能是在没有图形界面的纯文本环境中,为虚拟控制台提供鼠标支持,允许用户使用鼠标进行文本的选择、复制和粘贴操作,极大地提升了…
📅 2026/7/11 0:00:31
导语
先澄清一个常被混用的概念:BI试点"上线",并不等于试点"验收通过"。很多企业把仪表板做出来、账号发下去、培训开完场,就默认试点已经跑通,随后进入推广阶段——结果推广到第二个部门、第三个业务线时&am…
📅 2026/7/11 0:00:31
1. 项目背景与核心需求 在嵌入式系统开发中,快速精确的数据检索是一个常见但极具挑战性的需求。特别是在工业控制、医疗设备和物联网终端等场景下,系统往往需要在毫秒级时间内完成关键参数的读取和写入操作。传统基于Flash存储的方案存在擦写次数有限、操…
📅 2026/7/10 22:46:54
1. 工业电流环信号传输的基础认知在工业自动化领域,4-20mA电流环传输技术已经持续服役超过半个世纪。这种看似简单的信号传输方式之所以能经久不衰,核心在于其独特的抗干扰能力——电流信号在长距离传输时几乎不受线路电阻和电压波动的影响。我曾在化工厂…
📅 2026/7/10 22:46:54
最近在项目里尝试用 YOLO 做目标检测,从环境搭建到模型训练,再到推理部署,整个过程踩了不少坑。网上的资料虽然多,但要么版本老旧,要么步骤零散不成体系,对于刚入门的新手来说,很容易卡在某个环…
📅 2026/7/10 22:46:54
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/10 22:46:54
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/10 22:46:54
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/10 22:46:54