c++ - 什么是C++中的不确定行为?与未定义的行为有何不同?

标签 c++ c

C++中的不确定行为和未定义行为之间有什么区别?此分类也适用于C代码吗?

最佳答案

编辑1: C11和C++ 11的最新草案可在此处在线获得:C11 draft N1570C++11 draft n3242(如果您没有最终标准的副本,并且它们的外观很棒)。 (已完成对文本外观的其他调整以及一些措辞/语法编辑。)

编辑2:修复了所有出现的“行为”为“行为”以符合标准的情况。

搜索C++ 11和C11标准时,没有匹配的不确定规则或未定义规则。有不确定的值,不确定的顺序,不确定的未初始化等术语。

如果在Norman Gray的答案中似乎对陷阱和异常的讨论很奇怪,请知道这些术语确实反射(reflect)了 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首先定义为整数,但此时它没有明确定义的值-然后将其初始化为任意值(不确定/未知)物有所值!

众所周知的术语 undefined behavior 在C11中的3.4.3中定义,它指的是

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段;即,[介绍执行]中)。 (您可能会猜到,它指的是操作步骤的未指定顺序。)

如果IMO对所有这些细微差别感兴趣,则必须同时获得C++ 11和C11标准。这将使您能够探索定义等所需的详细级别。如果您没有此类链接,则本文提供的链接将帮助您利用最新发布的C11和C++ 11标准草案进行探索。

关于c++ - 什么是C++中的不确定行为?与未定义的行为有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11240484/

相关文章:

c++ - 删除指针时出现段错误

c - 对于不同类型的 var,如何重复使用变量而不出现错误 C2371(重新定义)?

c - 堆栈跟踪、GDB 中没有函数名称,但出现在 LLDB 中

c++ - 在C++中分割偶数字符串

c++ - Windows KMFD HelloWorld 驱动程序部署任务失败

c++ - 通过SHELLEXECUTEINFO将参数发送到.exe

c - 等子孙

c - RegSetValueExA() 函数在 C 中的注册表项名称中放置方 block

c - Mersenne Twister init_by_array() 函数说明

java - if-else if block 不包含else