【发布时间】:2021-06-02 12:47:42
【问题描述】:
C11 和 C17 标准都使用术语“转换说明符”和“格式说明符”。它们是同义词吗?如果是,那么为什么要引入同义词?如果不是,那它们有什么区别?
【问题讨论】:
-
我认为格式说明符是更广泛的术语,表示转换或长度说明符等。这都是草率写的。
标签: c language-lawyer c11 c17
C11 和 C17 标准都使用术语“转换说明符”和“格式说明符”。它们是同义词吗?如果是,那么为什么要引入同义词?如果不是,那它们有什么区别?
【问题讨论】:
标签: c language-lawyer c11 c17
“格式说明符”似乎只是一个半正式的术语。唯一使用该术语的规范文本是 inttypes.h 标题 7.8.1,没有提供“格式说明符”是什么的解释。尽管inttypes.h 将大小和类型/符号混合到一个术语中,但由于stdint.h 类型的性质。它说PRId32 中的d 是转换说明符,然后PRId32 整体应该是格式说明符?而 fprintf/fscanf 将例如“长度修饰符”和“转换说明符”分开,其中 %ld 中的 l 是长度修饰符,d 是转换说明符。
fprintf 和 fscanf 函数定义了一个术语转换规范,例如 C17 7.21.6.1,强调我的:
每个转换规范都由字符 % 介绍。在%之后,以下 依次出现:
- 零个或多个标志...
- 可选的最小字段宽度...
- 可选精度
- 可选的长度修饰符
- 转换说明符字符,用于指定要应用的转换类型。
以上也是术语转换说明符的正式定义。然后这些函数将有效的转换说明符列为d, i, f 等等。
看起来“格式说明符”和转换说明的意思是一样的。
【讨论】:
PRId32 作为“格式说明符”。现在printf("%.3" PRId32, (int32_t){1}); 中的内容是什么。整个%.3" PRId32 应该是一个转换规范。 PRId32 可能是“格式说明符”。而d 是一个转换说明符。
l in %ld 将是长度说明符:length specifier 或length modifier? C11:如果不存在 l 长度修饰符,则将 int 参数转换为无符号字符,并写入结果字符。
length specifier?
独立于标准,看其他答案很困惑,所以只看这些术语在英语中的含义,我倾向于说
“转换说明符” 描述了数据转换自或转换为的本机类型(int、char、double),而“格式说明符” 描述或包括表示(字段长度、填充)。
【讨论】:
%d和%x,它们都是转换(int)和表示(hex)。适当的说明符可以是%xd,这意味着要打印十六进制(演示)的 int(转换)。
remove、rename 和puts 函数可能设计得当并且没有问题。 stdio.h 的其余部分要么存在设计缺陷、已知缺陷,要么就是完全不合理。 printf/scanf 系列函数可能保持着对人类造成的金钱损失的世界纪录。我想不出任何接近的编程语言中的任何其他功能。当然,C 中有无数其他损坏的标准函数,但没有一个被频繁使用。
rename 的问题。 rename 的行为取决于主机文件系统 (FS),因此也取决于主机操作系统。在 Linux 下可以rename 已经打开的文件 [1],而在 Windows 上则不行。所以,我想知道为什么标准的rename 函数在不同的实现中有不同的行为。 [1] 即使它被错误/使用错误/错误打开或重命名。
格式说明符仅指定转换的格式(即'f'),其中转换说明符表示整个说明符(即%*13lf)。
我从这个答案中举了一个例子: What is the difference between conversion specification and format specifier in C?
【讨论】: