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-而非"错误")转换说明符?
转换规范的"有效性"由您引用的标准段落决定:
每个转换规范由字符%引入.在%之后,以下顺序出现:...
旗帜字符及其含义是:......
转换说明符及其含义是:...
这意味着由上述列表中的元素组成的任何转换规范都是有效的,所有其他转换规范都不在标准的视野中.这就是为什么代码中的段落提到了UB的两个原因.一种是不符合语法的规范,另一种是规范和类型不匹配.
您链接的评论似乎通俗地使用"无效".即两种转换规范的使用都是"无效的",因为它们导致UB.但从语言律师的角度来看,只有第一个是"无效的".