crack Asked:2020-10-31 17:30:46 +0000 UTC2020-10-31 17:30:46 +0000 UTC 2020-10-31 17:30:46 +0000 UTC 未定义、未指定和实现相关行为之间的区别 772 未定义的行为、未指定的行为和实现定义的行为有什么区别? c++ 2 个回答 Voted Best Answer αλεχολυτ 2020-10-31T18:16:47Z2020-10-31T18:16:47Z 未定义的行为- 未定义的行为。语言标准未强加任何要求的行为。当未指定显式行为或程序使用错误的构造或数据时,可能会出现未定义的行为。对未定义行为的可接受响应范围可以从完全忽略具有不可预测结果的情况,到根据环境的预期行为(有或没有输出诊断消息)在翻译或程序执行期间的正常行为,或终止翻译或程序执行(带有诊断消息的输出)。许多错误的程序结构不会导致未定义的行为,但需要输出适当的诊断消息。 未定义行为的示例: 访问允许范围之外的数组元素。例如,选择了 5 个元素,我们正在尝试读取索引 >= 5 的元素。 delete在基类中没有虚拟析构函数的情况下,通过静态类型为基类的指针删除派生类对象。 对变量进行多次更改,或者在没有评估顺序的情况下进行无序更改和独立读取。例如:i = i++ + i; 未指定的行为- 未指定的行为。正确程序和正确数据的行为,这取决于实现(编译器)。这种行为不需要在编译器文档中描述。 例子: 评估函数参数的顺序。 实现定义的行为- 在实现(编译器)中定义的行为。应该在任何编译器的文档中明确说明的行为。 例子: 标准类型的尺寸。例如,sizeof(int)。 函数的附加选项的存在main,除了int main()和int main(int, char**)。 ixSci 2020-10-31T18:10:21Z2020-10-31T18:10:21Z 以下是标准对未定义行为的说明: 本国际标准没有要求的行为 这是什么意思?这意味着任何事情都可能发生:检查,其结果 UB 可能无法正常工作,可能无法正常工作,或者完全退出程序。该程序可能会崩溃、冻结或其他任何情况。未定义的行为意味着程序不正确并且任何行为都是可能的。包括完全没有任何行为。 现在到未指定的: 行为,对于格式良好的程序构造和正确的数据,这取决于实现 如您所见,如果标准中没有指定行为,并不意味着程序不正确,而只是特定行为取决于实现。但这种行为是可以理解和预期的。那些。当运行多次使用相同实现的程序时,它不能改变。从标准的文本中应该清楚,未指定的行为和依赖于实现的行为意味着同一件事。唯一的区别是必须记录依赖于实现的行为,而未指定的行为则不需要: 行为,对于格式良好的程序构造和正确的数据,这取决于实现和每个实现文档
未定义的行为- 未定义的行为。语言标准未强加任何要求的行为。当未指定显式行为或程序使用错误的构造或数据时,可能会出现未定义的行为。对未定义行为的可接受响应范围可以从完全忽略具有不可预测结果的情况,到根据环境的预期行为(有或没有输出诊断消息)在翻译或程序执行期间的正常行为,或终止翻译或程序执行(带有诊断消息的输出)。许多错误的程序结构不会导致未定义的行为,但需要输出适当的诊断消息。
未定义行为的示例:
delete在基类中没有虚拟析构函数的情况下,通过静态类型为基类的指针删除派生类对象。i = i++ + i;未指定的行为- 未指定的行为。正确程序和正确数据的行为,这取决于实现(编译器)。这种行为不需要在编译器文档中描述。
例子:
实现定义的行为- 在实现(编译器)中定义的行为。应该在任何编译器的文档中明确说明的行为。
例子:
sizeof(int)。main,除了int main()和int main(int, char**)。以下是标准对未定义行为的说明:
这是什么意思?这意味着任何事情都可能发生:检查,其结果 UB 可能无法正常工作,可能无法正常工作,或者完全退出程序。该程序可能会崩溃、冻结或其他任何情况。未定义的行为意味着程序不正确并且任何行为都是可能的。包括完全没有任何行为。
现在到未指定的:
如您所见,如果标准中没有指定行为,并不意味着程序不正确,而只是特定行为取决于实现。但这种行为是可以理解和预期的。那些。当运行多次使用相同实现的程序时,它不能改变。从标准的文本中应该清楚,未指定的行为和依赖于实现的行为意味着同一件事。唯一的区别是必须记录依赖于实现的行为,而未指定的行为则不需要: