【问题标题】:Is the term "format specifier" a synonym for term "conversion specifier"?术语“格式说明符”是术语“转换说明符”的同义词吗?
【发布时间】:2021-06-02 12:47:42
【问题描述】:

C11 和 C17 标准都使用术语“转换说明符”和“格式说明符”。它们是同义词吗?如果是,那么为什么要引入同义词?如果不是,那它们有什么区别?

【问题讨论】:

  • 我认为格式说明符是更广泛的术语,表示转换或长度说明符等。这都是草率写的。

标签: c language-lawyer c11 c17


【解决方案1】:

“格式说明符”似乎只是一个半正式的术语。唯一使用该术语的规范文本是 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 等等。

看起来“格式说明符”和转换说明的意思是一样的。

【讨论】:

  • “转换说明符”似乎描述了本机类型(int、char、double),而“格式说明符”似乎描述/包含了表示形式(字段长度、填充)。
  • @PaulOgilvie inttypes.h 格式说明符列表例如 PRId32 作为“格式说明符”。现在printf("%.3" PRId32, (int32_t){1}); 中的内容是什么。整个%.3" PRId32 应该是一个转换规范。 PRId32 可能是“格式说明符”。而d 是一个转换说明符。
  • l in %ld 将是长度说明符length specifierlength modifier? C11:如果不存在 l 长度修饰符,则将 int 参数转换为无符号字符,并写入结果字符。
  • 在哪个部分提到了length specifier
  • @pmor 那是一个错字,应该是修饰符。
【解决方案2】:

独立于标准,看其他答案很困惑,所以只看这些术语在英语中的含义,我倾向于说

“转换说明符” 描述了数据转换自或转换为的本机类型(int、char、double),而“格式说明符” 描述或包括表示(字段长度、填充)。

【讨论】:

  • 对于那些试图实现编译器的人来说,这还不够好。该标准不应随意使用未定义的术语。设计草率适用于整个 stdio.h。
  • @Lundin,我认为我的定义非常准确。但是有一些混合,例如%d%x,它们都是转换(int)和表示(hex)。适当的说明符可以是%xd,这意味着要打印十六进制(演示)的 int(转换)。
  • @Lundin 尽管整个 stdio.h 的设计马虎。 stdio.h 的其他哪些部分设计马虎?你能提供例子吗?
  • @pmor 提及正确设计的部分会更容易。我认为removerenameputs 函数可能设计得当并且没有问题。 stdio.h 的其余部分要么存在设计缺陷、已知缺陷,要么就是完全不合理。 printf/scanf 系列函数可能保持着对人类造成的金钱损失的世界纪录。我想不出任何接近的编程语言中的任何其他功能。当然,C 中有无数其他损坏的标准函数,但没有一个被频繁使用。
  • @Lundin 我遇到了rename 的问题。 rename 的行为取决于主机文件系统 (FS),因此也取决于主机操作系统。在 Linux 下可以rename 已经打开的文件 [1],而在 Windows 上则不行。所以,我想知道为什么标准的rename 函数在不同的实现中有不同的行为。 [1] 即使它被错误/使用错误/错误打开或重命名。
【解决方案3】:

格式说明符仅指定转换的格式(即'f'),其中转换说明符表示整个说明符(即%*13lf)。

我从这个答案中举了一个例子: What is the difference between conversion specification and format specifier in C?

【讨论】:

  • 术语转换说明符有一个正式的定义:(7.21.6/4)“一个转换说明符字符,它指定要应用的转换类型。”然后它说“转换说明符及其含义是:d,i”等等。所以我不确定您的答案或您链接的答案是否正确。
  • 啊等一下,现在再次阅读链接。他并不是说转换 specifier 是整个说明符。他是说转换 specification 是整个说明符。
猜你喜欢
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 2017-11-16
  • 2013-12-20
相关资源
最近更新 更多