当 printf 的相应参数不是短/字符时,使用 h 或 hh 长度修饰符是否非法?

2023-11-25

The printf函数族提供了一系列长度修饰符,其中两个是hh(表示一个signed char or unsigned char论点提升为int) and h(表示一个signed short or unsigned short论点提升为int)。从历史上看,引入这些长度修饰符只是为了与以下长度修饰符创建对称性:scanf并且很少用于printf.

以下是 ISO 9899:2011 §7.21.6.1“fprintf 函数”¶7 的摘录:

7 长度修饰符及其含义是:

  • hh指定以下d, i, o, u, x, or X转换说明符适用于signed char or unsigned char参数(参数将根据整数提升进行提升,但其值应转换为signed char or unsigned char打印前);或者以下n转换说明符适用于指向有符号字符的指针 争论。

  • h指定以下d, i, o, u, x, or X转换说明符适用于short int or unsigned short int参数(参数将根据整数提升进行提升,但其值应转换为short int or unsigned short int打印前);或者以下n转换说明符适用于指向短整型的指针int争论。

  • ...

忽略案例n转换说明符,这些几乎相同的段落对以下行为有何说明h and hh?

  • In 这个答案,据称传递一个超出 a 范围的参数signed char, signed short, unsigned char, or unsigned short分别。对于转换规范h or hh长度修饰符分别是未定义的行为,因为参数没有从类型转换而来char, short等。前。
  • 我声称该函数对于每个类型值都以明确定义的方式运行int然后printf其行为就像参数被转换为char, short等。转换前。
  • 人们还可以声称,在默认参数提升之前使用不属于相应类型的参数调用函数是未定义的行为,但这似乎很深奥。

§7.21.6.1¶7 的这三种解释(如果有的话)哪一种是正确的?


该标准规定:

如果任何参数不是相应转换规范的正确类型,则行为未定义。

[C2011 7.21.6.1/9]

“正确的类型”的含义可以想象,可以解释,但对我来说最合理的解释是转换规范“适用于”的类型,如同一节前面所指定的,以及部分引用的,的问题。我采取括号内的关于参数提升的评论要承认普通的参数传递规则,并避免这些函数是特殊情况的任何暗示。我不认为括号中的注释与确定参数的“正确类型”相关。

如果您传递的参数类型比转换规范的正确类型更宽,实际会发生什么是另一个问题。我倾向于相信 C 系统不太可能被任何人实现,因此它是否会产生影响printf()论证实际上是一个char,或者是否是一个int其值在范围内char。然而,我断言,编译器检查参数类型与格式的对应关系,并在不匹配的情况下拒绝程序是有效的行为(因为在这种情况下所需的行为是明确未定义的)。

另一方面,我当然可以想象printf()如果参数的值超出相应转换说明符隐含的范围,则实现实际上会出现错误(打印垃圾、损坏内存、吃掉你的午餐)。由于行为未定义,这也是允许的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 printf 的相应参数不是短/字符时,使用 h 或 hh 长度修饰符是否非法? 的相关文章

  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • 头文件中实现的函数的静态与内联

    我想到的方式inline在 C 中用于链接 作用域 我把它放在同一个篮子里extern and static对于全局对象 通常 对于在头文件中实现的函数 我的首选解决方案是将其设为静态 In Foo h static void foo Do
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • 如何通过 libwebsocket 发送异步数据?

    我正在将 Warmcat 的 libwebsocket C 库用于小型 Websocket 服务器 我已经启动并运行了这些示例 并且可以发送数据以响应从 websocket 接收数据 例如回显发送的反向字节 但是 我无法弄清楚如何在不使用
  • 选择initializer_list迭代器定义

    Why std initializer list
  • 从内存流播放视频文件

    只是好奇看看这是否可能 我有一个 Windows 应用程序 它从我的电脑上的 avi 文件读取所有字节 然后将其存储在 byte 中 现在我的内存中有 avi 文件 我想直接从内存将其加载到某种视频播放器控件中 我尝试过使用 wmplaye
  • 为什么像 BindingList 或 ObservableCollection 这样的类不是线程安全的?

    我一次又一次发现自己必须编写 BindingList 和 ObservableCollection 的线程安全版本 因为当绑定到 UI 时 这些控件无法从多个线程更改 我想理解的是why情况就是这样 这是设计错误还是故意的 问题是设计一个线
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • C# 中的抽象类和接口类有什么不同?

    C 中的抽象类和接口类有什么不同 An 接口不是类 它只是一个contract定义了public一个类的成员must实施 抽象类只是一个类 您从中可以cannot创建一个实例 通常您会使用它来定义一个基类 该基类定义了一些virtual方法
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • Windows 上本机 C++ 应用程序中的自动死代码检测?

    背景 我有一个用原生 C 编写的应用程序 花了几年的时间 大约有 60 KLOC 有很多函数和类已经死了 可能有 10 15 就像下面提出的类似的基于 Unix 的问题 我们最近开始对所有新代码进行单元测试 并尽可能将其应用于修改后的代码
  • 使用 dateTimePicker 在 DataGridView 中编辑日期

    我有一个DateTime我的 WinForms 中的专栏DataGridView 目前只能通过手动输入日期来编辑该字段 例如 2010 09 02 需要什么才能拥有一个DateTimePicker 或同等 用作编辑器 DataGridVie
  • 调试错误:在 vc++ 项目中使用 COM 时发生 所需的运行时?

    我为我的工作创建了一个 COM 组件 我也注册了该组件 在我的系统上 我有两个虚拟机工作站 在我的第一个工作站中 它运行良好 在我的第二个工作站中 它显示一个包含消息的错误框该程序需要一段时间并以不寻常的方式关闭 请联系应用程序管理员 我认
  • 如何重用具有稍微不同的 ProcessStartInfo 实例的 Process 实例?

    我有以下开始的代码robocopy https technet microsoft com en us library cc733145 aspx as a Process 我还需要进行数据库查询以确定每次需要复制哪些目录robocopy被
  • 为什么 C++ 标准没有将 sizeof(bool) 定义为 1?

    Size of char signed char and unsigned char由 C 标准本身定义为 1 个字节 我想知道为什么它没有定义sizeof bool also C 03 标准 5 3 3 1 说 sizeof char s
  • Unity - 在生成时获取随机颜色

    我有一个小问题 我想在我的场景中生成四边形 它们都应该有红色或绿色作为材质 但 Random Range 函数只能是 int 我该如何解决它 void SpawningSquadsRnd rndColor 0 Color red rndCo
  • C# PasswordDeriveBytes:似乎 Salt 并不重要

    可能我误解了什么 以下代码通过 CryptDeriveKey 使用两种不同的盐生成两个相等的密钥 这是控制台结果 盐1 21 3e 18 a3 9a 8b 5f gt 键 da 89 ea 3d 91 08 20 98 20 e9 dc 4
  • 如何通过API退出Win32应用程序?

    我有一个使用 Win32 API 编写的 C Win32 应用程序 我希望强制它在其中一个函数中退出 有没有类似的东西Exit or Destroy or Abort 类似的东西会终止它吗 哎呀呀呀呀呀呀 不要做任何这些事情 exit 和
  • 创建进程默认浏览器

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 我想获取线程 id 因此 ShellExecute 无法获取线程 id 因此我开始使用

随机推荐

  • 如何引用同一 appsettings.json 文件中的另一个值?

    我需要在 appsettings json 中的两个位置使用数据库连接字符串 是否可以在 json 文件中引入公共变量或 json path 相关引用以避免潜在的问题 如果能在不接触 C 代码的情况下拥有它 那就太棒了 Connection
  • 使用 sed 编辑 crontab

    我正在编写一个 sed 命令 该命令应取消注释 crontab 中的条目 有一个更好的方法吗 我想到的第一个选项是 sed Example crontab l 5 3 bash test sh sed 命令应取消注释该条目 这就是我现在所拥
  • 使用 JavaScript 更改 HTML 名称属性

    按下一个div 我把它做成了button与其他代码 我想要以下代码 div 1 br div 更改名称name w1 0 to name w1 1 我正在使用以下 JavaScript function weekclick id docum
  • 模数运算符运行第一项,然后每第三项运行

    所以我需要它在第一个循环上运行 然后在每个第三个循环上运行 if k 3 k 1 echo div class modcontainer 对我来说似乎很简单 但我不了解模数 模数返回余数 而不是布尔值 这段代码将解析为true for 1
  • 如何根据 R 中的列值范围拆分数据框?

    我有一个这样的数据集 Users Age 1 2 2 7 3 10 4 3 5 8 6 20 如何将此数据集拆分为 3 个数据集 其中第一个数据集包含年龄在 0 5 岁之间的所有用户 第二个数据集包含 6 10 岁 第三个数据集包含 11
  • 在 iOS4 中 UIWebView 播放视频损坏?

    我有一个从 SDK 2 0 版开始运行的应用程序 我在其中创建并添加 UIWebView 然后加载 mov 的 URL 来播放电影 从 4 0 beta 的早期版本到 4 0 GM 此功能已停止工作 当我现在加载电影时 出现以下错误 插件处
  • 使用 savemat 保存和加载 Python dict 会导致错误

    这是我收到的错误的一个最小示例 如果我正确理解了文档 这应该可以工作 但似乎我没有 a a test1 1 a test2 2 a test3 3 import scipy io as io io savemat temp a a b io
  • Android Instant Apps - 无法“运行未经验证的软件、运行任意本机代码”。仅即时应用程序运行时

    Android Instant Apps 文档中指出受限功能部分它不能 运行未经验证的软件 运行任意本机代码或动态加载除免安装应用运行时提供的代码之外的代码 我不完全理解上述声明 但在我看来 它可能不接受任何第三方软件或除中给出的库之外的任
  • Bash:Git 子模块 foreach?

    I have sup别名为submodule foreach git co master git up co up是别名checkout pull rebase 分别 如何添加条件 以便如果子模块名称是Libraries JSONKit 它
  • 设置 Scrapy 代理中间件在每个请求上轮换

    这个问题必然有两种形式 因为我不知道更好的解决途径 我正在爬行的网站经常将我踢到重定向的 用户被阻止 页面 但频率 按请求 时间 似乎是随机的 并且他们似乎有一个黑名单阻止了我正在使用的许多 开放 代理列表通过代理网格 所以 当 Scrap
  • Node.js - Express.js JWT 始终在浏览器响应中返回无效令牌错误

    我正在使用node js和express js快递 jwt模块 并且我设置了一个简单的 HTTP 服务器来测试所有内容 这是涉及的节点代码 app set port process env PORT 3000 app use express
  • Kubernetes - 没有选择器的服务

    我正在为没有选择器的 Kubernetes 服务而苦苦挣扎 该集群通过 kops 安装在 AWS 上 我有一个包含 3 个 nginx pod 的部署 暴露端口 80 apiVersion apps v1 kind Deployment m
  • 会话的跨子域 cookie 处理?

    是否可以设置一个有效的身份验证 cookie sub1 domain com sub2 domain com 或者每个子域总是需要它自己的 cookie 如果指定要附加到域的 cookie 则可以跨子域使用 cookie domain co
  • 拳击和加宽

    这两者有什么区别呢 我知道拳击正在将原始值转换为引用 什么是扩大 另外 首先应该进行拳击还是应该进行加宽的顺序应该是什么 扩大对拳击和 var args 的胜利 拳击战胜了 var args 引用变量的扩宽取决于继承 因此 Integer
  • 如何使用 Mercurial 子存​​储库来共享组件和依赖项?

    我们使用 C 开发 NET 企业软件 我们正在寻求改进我们的版本控制系统 我以前使用过mercurial 并且一直在我们公司尝试使用它 然而 由于我们开发企业产品 我们非常关注可重用的组件或模块 我一直在尝试使用 Mercurial 的子存
  • UIActivityIndi​​catorView 在 UICollectionViewCell 中不旋转

    我有一个自定义单元格加载在我的集合视图的底部 它唯一的工作是显示活动指示器视图 这在应用程序进行新的工作调用时发生 所以我将它添加到单元格中 如下所示 BBLoaderCell loaderCell collectionView deque
  • 在 d3 中缩放投影是什么意思?

    我知道在 D3 中 尺度是从输入数据值 域 到输出数据值 范围 的数学映射 我知道我可以设置一个比例 将域的输入映射到一个范围 如下所示 var scale d3 scale linear domain 100 500 range 10 3
  • 导出 JasperReports 查询结果

    在我的 Java 项目中 我有很多带有复杂 SQL 查询的 JasperReports 报告 其中包含很多参数 这些报告用于生成包含查询返回的数据的 pdf 文档 这些数据以各种方式分组和格式化 现在我还需要直接导出查询结果 例如 Resu
  • 如何从 Python Pyramid 提供临时文件

    目前 我只是提供这样的文件 view callable def export request response Response content type application csv use datetime in filename t
  • 当 printf 的相应参数不是短/字符时,使用 h 或 hh 长度修饰符是否非法?

    The printf函数族提供了一系列长度修饰符 其中两个是hh 表示一个signed char or unsigned char论点提升为int and h 表示一个signed short or unsigned short论点提升为i