c/c++语言开发共享什么是“无效的转换规范”?

根据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中

    小写字母可以添加到fprintffscanf的转换说明符和长度修饰符。 其他字符可用于扩展。

    其中没有提及CS与其参数(如果有的话)之间的关系。 因此,CS的“有效性”不依赖于提供的参数。

    现在,那说了几个指针

    现在,例如,如果两种情况都合并在一起,很难分辨出哪种情况会导致UB,但由于多种原因,UB肯定是UB。

    例:

      printf("%D", str); 

    跟着这个问题。

      以上就是c/c++开发分享什么是“无效的转换规范”?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(计算机技术网)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ctvol.com/c-cdevelopment/541938.html

      (0)
      上一篇 2021年1月5日
      下一篇 2021年1月5日

      精彩推荐