什么是"无效的转换规范"?

Sou*_*osh 4 c printf language-lawyer conversion-specifier

根据C11章节§7.21.6.1,P9

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

到时候,我的理解是,为

  char str [] = "Sourav";
Run Code Online (Sandbox Code Playgroud)
  • 一个声明就像printf("%S", str);属于第一句话,没有CS作为%S(UPPERCASE)
  • 如陈述printf("%d", str);属于第二句(CS和参数类型不匹配,但是%d不是 "无效" CS,反正)

直到最近的评论帖子通知为止.

我的理解错了吗?第二个语句是否可以归类为"无效"(PS-而非"错误")转换说明符?


更新:删除答案和评论主题,这里是 <10K用户的快照.

Sto*_*ica 9

转换规范的"有效性"由您引用的标准段落决定:

7.21.6.1 - p4至p8

每个转换规范由字符%引入.在%之后,以下顺序出现:...

旗帜字符及其含义是:......

转换说明符及其含义是:...

这意味着由上述列表中的元素组成的任何转换规范都是有效的,所有其他转换规范都不在标准的视野中.这就是为什么代码中的段落提到了UB的两个原因.一种是不符合语法的规范,另一种是规范和类型不匹配.

您链接的评论似乎通俗地使用"无效".即两种转换规范的使用都是"无效的",因为它们导致UB.但从语言律师的角度来看,只有第一个是"无效的".