为什么 printf("%f",0);给出未定义的行为?

2023-11-27

该声明

printf("%f\n",0.0f);

打印 0。

然而,该声明

printf("%f\n",0);

打印随机值。

我意识到我表现出了某种未定义的行为,但我无法具体弄清楚为什么。

所有位均为 0 的浮点值仍然有效float值为 0。
float and int在我的机器上尺寸相同(如果相关的话)。

为什么在中使用整数文字而不是浮点文字printf导致这种行为?

附:如果我使用,可以看到相同的行为

int i = 0;
printf("%f\n", i);

The "%f"格式需要类型参数double。你给它一个类型参数int。这就是行为未定义的原因。

该标准不保证全零是有效的表示0.0(尽管经常如此),或任何double值,或者那个int and double大小相同(记住它是double, not float),或者,即使它们大小相同,它们也会以相同的方式作为参数传递给可变参数函数。

它可能碰巧在您的系统上“工作”。这是未定义行为的最糟糕的症状,因为它使得诊断错误变得困难。

N15707.21.6.1 第 9 段:

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

类型参数float被提升为double, 这就是为什么printf("%f\n",0.0f)作品。整数类型的参数小于int被提升为int or to unsigned int。这些升级规则(由 N1570 6.5.2.2 第 6 段指定)在以下情况下没有帮助:printf("%f\n", 0).

请注意,如果您传递一个常量0到一个非可变参数函数,该函数期望double参数,行为是明确定义的,假设函数的原型是可见的。例如,sqrt(0) (after #include <math.h>) 隐式转换参数0 from int to double-- 因为编译器可以从声明中看到sqrt它期望一个double争论。没有这样的信息printf。可变参数函数如printf是特殊的,在给他们写电话时需要更加小心。

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

为什么 printf("%f",0);给出未定义的行为? 的相关文章

随机推荐

  • CPAN 首次启动(代理配置)

    我需要通过代理运行 cpan 但是当我尝试配置时出现错误 并且第一次无法进入 cpan root srv linux01 cpan CPAN pm requires configuration but most of it can be d
  • 使用 ASP.NET 日历控件时如何隐藏周末?

    有时 在显示日历时 需要防止显示周末日期和日期标题中的周末名称 有没有办法使用ASP NET 日历控件 由于提供了控件 因此在不重写控件的情况下无法执行此操作 执行此操作的一种方法是覆盖当天渲染 and Render在将输出发送回客户端之前
  • 在应用程序购买中,用户在应用程序处于后台时取消交易:交易状态保持在购买状态

    当应用程序处于后台且用户尚未登录商店时 我在应用程序购买 沙盒环境 中取消用户时出现一些奇怪的行为 流程如下 用户未登录 未在 设置 gt 商店 中设置应用程序 ID 用户点击购买按钮 这调用 SKPaymentQueue defaultQ
  • 动态地将可调用对象添加到类作为实例“方法”

    我实现了一个元类 它拆除用它创建的类的类属性 并根据这些参数的数据构建方法 然后将这些动态创建的方法直接附加到类对象 所讨论的类允许轻松定义 Web 表单对象在网络测试框架中使用 它一直工作得很好 但现在我需要添加一种更复杂类型的方法 为了
  • 在ios中使用查询字符串创建NSURLRequest

    我在 ios 中创建了一个用户查询表单 我使用 php 作为服务器端 我在 IOS 中构造了如下所示的查询字符串 http www mydomain in androidmail enquiry php name Vinoth Kumar
  • 如何将包含单引号的字符串保存到 PostgreSQL 中的文本列

    我在 Smartwcm Web 应用程序 SDK 中使用 hibernate 和 PostgreSQL 作为数据库 我在其中一个表中有一个字段 其数据类型是文本 当我尝试使用 hibernate 使用相应的 POJO 将值插入表中时 如果我
  • 无法使用 VS 2013 RTM 编译 OpenCV 2.4.5

    有人用 VS 2013 RTM 编译过 openCV 吗 我尝试在 IlmImf 模块中获取一堆 min 不属于命名空间 std max 不属于命名空间 std 并且 opencv features2d 无法编译并出现以下错误 opencv
  • 如何设置
    元素的箭头样式?

    我正在使用这段代码 另请参阅JSFiddle 以更改悬停时箭头的背景颜色 但是 这不起作用 因为箭头仅在单击时更改其颜色 summary webkit details marker color B6B6B6 font size 20px m
  • ClassInitialize 中生成的数据驱动测试:不再在 Visual Studio 2012 中工作

    我已从 Visual Studio 2010 升级到 Visual Studio 2012 在我的单元测试项目中 我有一个 ClassInitialize 方法 它生成一个 CSV 文件 然后使用连接到 CSV 的 DataSource 将
  • 数据库如何自动生成唯一标识符?

    我有一个带有 id guid 列的 sql 表 如何强制数据库为每条新记录自动生成新的 guid Add DEFAULT newid
  • Global.asax 中的 ASP.NET 路由

    我试图通过以下方式在我的 Web 表单应用程序中添加一条路线 http msdn microsoft com en us library cc668201 aspx adding routes to a web forms applicat
  • faces-redirect 和后退按钮导致其他链接无法正常工作

    我有一个关于面孔导航的问题 所以我有一个页面 它采用请求参数来加载特定用户 此页面显示 commandLink 列表 单击该列表后 将使用隐式导航重定向到另一个页面 通过调用 preRenderView 中的方法来加载用户 我们重定向到的页
  • 如何将协作者添加到 Firebase 应用程序?

    在最新版本的Firebase 在 Google I O 2016 期间宣布 如何将我想要的其他人添加到我的项目或应用程序中collaborate和 我通过以下途径认识了 IAM 角色Settings gt Permissions 这是正确的
  • Bootstrap Tour 不记得我离开的地方

    当我到达第二页时 我在多页游览中启动 Bootstrap Tour 时遇到问题 我以点击事件开始游览localStorage被设定为false 游览从单击事件开始正常 但是当我转到游览的第二步并加载新页面时 游览不会从中断处继续 如何在这个
  • 使 WCHAR 为空终止

    我有这个 WCHAR 文件名 1 作为函数的返回值 它是 sys 32 函数 因此我无法更改返回的类型 我需要使 fileName 以 null 结尾 因此我尝试将 0 附加到它 但似乎没有任何效果 一旦我得到一个以 null 结尾的 WC
  • Jasper Reports 使用 comparatorExpression 进行交叉表排序

    我正在尝试根据某些自定义方案对交叉表中的动态列进行排序 在文档中 我发现提到了comparatorExpression 交叉表组存储桶比较器表达式 这个表达式的结果是 用于按升序或降序对存储桶进行排序 如果没有比较器 指定表达式时 将使用自
  • 创建/更新文档日期的摄取管道

    我正在尝试实现类似于 Mysql 的行为 为我通过 ES 管道索引的每个文档的元数据添加 insert at updated at 我的管道是这样的 description Adds createdAt and updatedAt styl
  • 如何访问和处理嵌套对象、数组或 JSON?

    我有一个包含对象和数组的嵌套数据结构 如何提取信息 即访问特定或多个值 或键 例如 var data code 42 items id 1 name foo id 2 name bar 我怎样才能访问name中的第二项items 预赛 Ja
  • 如何使用 C# 从 MS Office 文档中提取文本

    我试图使用 C 从 MS Word doc docx Excel 和 Powerpoint 中提取文本 字符串 在哪里可以找到免费且简单的 Net 库来阅读 MS Office 文档 我尝试使用 NPOI 但没有获得有关如何使用 NPOI
  • 为什么 printf("%f",0);给出未定义的行为?

    该声明 printf f n 0 0f 打印 0 然而 该声明 printf f n 0 打印随机值 我意识到我表现出了某种未定义的行为 但我无法具体弄清楚为什么 所有位均为 0 的浮点值仍然有效float值为 0 float and in