
当C ++代码在语法上有效,但其行为未在标准中定义时,在俄语语言文献中通常简称为未定义行为。 在标准本身中,对于这种情况,有多达3个术语: 未定义行为 , 未指定行为和实现定义的行为 。 在本文中,我们将了解它们之间的区别。
实现定义的行为
该术语用于描述C ++代码完全有效,但其行为取决于实现(例如,编译器或运行时)的情况,并且记录了此行为 。 例如,指针或int类型的字节大小取决于特定的实现或编译器设置,但这在文档中有所描述,您可以依赖此文档。
未指明的行为
该术语表示有效的C ++代码的行为不是由标准定义的,而是取决于实现方式,此外,它没有记录在案 (至少是正式记录)。 示例:计算函数参数值的过程由编译器确定,但是没有关于如何进行描述的描述。 该标准告诉我们:这些行为特性在任何地方都不是固定的,因此,您不能依赖它们。 因此,您的代码的行为不应取决于这些功能。
未定义的行为
这是不确定性最危险的变体。 在标准中,它用来描述可能导致完全不可预测的后果的行为。 最引人注目的示例是访问数组的边界或取消对释放对象的指针的引用。 最糟糕的部分是该程序不必立即结束甚至不会产生任何类型的错误,但是,它的行为不再可以依靠。
最后,我再次提醒您,以上所有术语均指将成功编译的语法有效代码(但是,编译器通常会针对未定义行为的最明显情况发出警告)。 从标准的角度来看,无效的代码称为格式错误的程序 。