- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
看起来可能是,有(至少在 C99 中)可以应用于 int
的长度修饰符:%hhd
、%hd
, %ld
and %lld
表示signed char
, short
, long
code> 和 long long
。甚至还有适用于 double
的长度修饰符:%Lf
表示 long double
。
问题是为什么他们省略了float
?按照该模式,它可能是 %hf
。
最佳答案
因为在 C 可变参数函数调用中,任何 float
参数都被提升(即转换)为 double
,所以 printf
得到一个 double
并将使用 va_arg(arglist, double)
将其放入其实现中。
过去(C89 和 K&R C)每个 float
参数都被转换为 double
。当前标准省略了对具有显式原型(prototype)的固定元数函数的这种提升。它与 ABI 有关(详细信息在其中解释) & calling conventions的实现。实际上,float
值在作为参数传递时通常会加载到双浮点寄存器中,但细节可能有所不同。阅读 Linux x86-64 ABI specification举个例子。
此外,没有实际理由为 float
提供特定的格式控制字符串,因为您可以调整输出的宽度(例如使用 %8.5f
)作为需要,并且 %hd
在 scanf
中比在 printf
除此之外,我猜原因(省略 %hf
指定 float
- 提升为 double
in caller- in printf
) 是历史性的:起初,C 是一种系统编程语言,而不是 HPC 语言(直到 1990 年代后期,Fortran 才成为 HPC 的首选语言)并且float
不是很重要;它曾经(现在仍然)被认为是short
,一种降低内存消耗的方法。今天的 FPU 足够快(在台式机或服务器计算机上)以避免使用 float
除非作为使用更少内存的手段。您基本上应该相信每个 float
都在某处(可能是 在 FPU 或 CPU 中)转换为 double
。
实际上,您的问题可能被解释为:为什么 %hd
存在于 printf
(它基本上没用,因为 printf
正在获取一个 int
当你传递给它一些 short
时;但是 scanf
需要它!)。我不知道为什么,但我想它可能比在系统编程中更有用。
您可以花时间游说下一个 ISO C 标准以使 %hf
被 printf
接受用于 float
(提升为 double
在 printf
调用中,例如 short
-s 被提升为 int
),当 double 值超出范围时具有未定义的行为绑定(bind)到 float
-s,并且对称地 %hf
被 scanf
接受为 float
指针。祝你好运。
关于c - 为什么没有在 `float` 中定义 `printf` 的说明符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32517932/
我正在使用 Gunicorn 为 Django 应用程序提供服务,它工作正常,直到我将其超时时间从 30 秒更改为 900000 秒,我不得不这样做,因为我有一个用例需要上传和处理一个巨大的文件(过程
我有一个带有非常基本的管道的Jenkinsfile,它可以旋转docker容器: pipeline { agent { dockerfile { args '-u root' } } stag
在学习 MEAN 堆栈的过程中,我遇到了一个问题。每当我尝试使用 Passport 验证方法时,它都不会返回任何响应。我总是收到“localhost没有发送任何数据。ERR_EMPTY_RESPONS
在当今的大多数企业堆栈中,数据库是我们存储所有秘密的地方。它是安全屋,是待命室,也是用于存储可能非常私密或极具价值的物品的集散地。对于依赖它的数据库管理员、程序员和DevOps团队来说,保护它免受所
是否可以创建像图片上那样的边框?只需使用 css 边框属性。最终结果将是没 Angular 盒子。我不想添加额外的 html 元素。我只想为每个 li 元素添加 css 边框信息。 假设这是一个 ul
我是一名优秀的程序员,十分优秀!