C中的不确定行为是什么?它与未定义的行为有什么不同?

C中的不确定行为与未定义的行为有什么区别?这个分类是否也适用于C代码?
最佳答案
编辑1:C11和C11的最后草稿可以在这里:C11 draft N1570C++11 draft n3242,如果你没有最终标准的副本和他们的样子。 (文字外观的其他调整和一些措辞/语法编辑已经完成了。)

编辑2:将所有出现的“行为”修正为符合标准的“行为”。

搜索C11和C11标准,不符合不确定规则或未定义规则。有诸如不确定价值,不确定排序,不确定未初始化等等。

如果在诺曼·格雷的答案中谈到陷阱和例外情况似乎很奇怪,那么这些术语确实反映了C11标准第3节的相关定义。

C依赖于C的定义。关于行为类型的许多有用的定义可以在C11的第3节(C11)中找到。例如,不确定的值在3.19.2中定义。请注意,C11的第2节(规范性参考文献)为其他术语解释提供了其他来源,第4节定义了由于不遵守标准而导致诸如未定义行为之类的案例。

C11的3.4节定义了行为,3.4.1定义了实现定义的行为,3.4.2定义了语言环境特定的行为,3.4.3定义了未定义的行为,3.4.4定义了未指定的行为。对于值(第3.19节),有实现定义的值,不确定的值和未指定的值。

简单地说,术语不确定是指未指定/未知的状态,它本身不会导致未定义的行为。例如,这个C代码涉及不确定的值:{int x = x; }。 (这实际上是C 11标准中的一个例子)这里x被定义为一个整数,但是在这一点上它没有一个很好定义的值 – 而且它被初始化为任何(不确定/未知)值具有!

着名的术语未定义行为在C11中的3.4.3中定义,并指a的任何情况

nonportable or erroneous program construct or of erroneous data, for which this International Standard imposes no requirements

换句话说,未定义的行为是一些错误(在逻辑或状态),下一步发生什么都是未知的!所以可以做出一个未定义的[行为]规则,规定:在编写C/C++代码时避免未定义的行为! 🙂

不确定的[行为]规则将是:避免写入不确定的代码,除非它是必需的,并且不会影响程序的正确性或可移植性。所以与不确定的行为不同,不确定的行为并不一定意味着代码/数据是错误的,但是后续的使用可能是错误的,也可能不是错误的 – 需要注意的是确保维护程序的正确性。

其他诸如不确定排序的术语在正文中(例如,C11 5.1.2.3第3段; C 11,第1.9节第13段;即[在执行中])。 (你可能会猜到,它是一个未指定的操作步骤顺序。)

海事组织如果对所有这些细微差别感兴趣,收购C11和C11标准是必须的。这将允许人们通过定义等来探索所需的详细程度。如果您没有这样的链接,将帮助您探索最新发布的C11和C11草案标准。

转载注明原文:C中的不确定行为是什么?它与未定义的行为有什么不同? - 代码日志