根据C11
,章节§7.21.6.1,P9
如果转换规范无效,则行为未定义。 282)如果任何参数不是相应转换规范的正确类型,则行为未定义。
到时候,我的理解是,为
char str [] = "Sourav";
直到最近的评论post通知为止 。
我的理解错了吗? 第二个语句是否也可以归类为“无效”(PS-而非“错误”)转换说明符?
更新:删除答案和评论主题, 这里是 <10K用户的快照 。
转换规范的“有效性”由您引用的标准段落确定:
7.21.6.1 – p4至p8
每个转换规范由字符%引入。 在%之后,以下顺序出现:…
旗帜字符及其含义是:……
转换说明符及其含义是:…
这意味着由上述列表中的元素组成的任何转换规范都是有效的,所有其他转换规范都不在标准的视野中。 这就是为什么代码中的段落提到了UB的两个原因。 一种是不符合语法的规范,另一种是规范和类型不匹配。
您链接的评论似乎通俗地使用“无效”。 即两种转换规范的使用都是“无效的”,因为它们导致UB。 但从语言律师的角度来看,只有第一个是“无效的”。
脚注282指向未来图书馆方向C11 7.31.11p1 :
小写字母可以添加到fprintf和fscanf中的转换说明符和长度修饰符。 其他字符可用于扩展。
所以它也暗示无效的转换说明符指的是那些不在列表中的转换规范,其中, 小写字母可能会被未来的C版本使用; 和扩展可以免费使用其他字母。
而非规范性的, C11附录J.2。 包含以下内容:
即, *printf
的无效转换规范在这里与strftime
无效转换规范配对 – 它不接受变量参数,并且转换规范和相应参数之间的不匹配不会导致无效;
这可以与之形成对比
讨论了参数和转换说明符之间的不匹配,但没有提到无效这个词。
为了支持我的理解(并且可能首先要理解理解),让我加上我的两分钱。
如上所述,让我们看一下脚注282。 它说,
请参阅“未来的图书馆方向”(7.31.11)。
在§7.31.11中
小写字母可以添加到
fprintf
和fscanf
的转换说明符和长度修饰符。 其他字符可用于扩展。
其中没有提及CS与其参数(如果有的话)之间的关系。 因此,CS的“有效性”不依赖于提供的参数。
现在,那说了几个指针
现在,例如,如果两种情况都合并在一起,很难分辨出哪种情况会导致UB,但由于多种原因,UB肯定是UB。
例:
printf("%D", str);
跟着这个问题。
以上就是c/c++开发分享什么是“无效的转换规范”?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/541938.html