未定义与未指定与实现定义的行为

时间:2017-05-26 00:13:47

标签: c++ c

维基百科有关于undefinedunspecified行为的网页,其中的链接在此处的评论和答案中得到充分利用。

每一个都以的注释开头,不要与其他混淆,但除了一个没有非常明确的句子,他们没有指出它们之间的区别。

其中一个给出了一个示例(比较2个变量的地址:&a < &b)和注释,这将导致C ++中未指定的行为,在C 中未定义。

是否可以以明确,易懂的方式查明未定义未指定行为之间的重大差异

2 个答案:

答案 0 :(得分:13)

简而言之:

  • 未定义的行为:这是不行的
  • 未指明的行为:这是可以的,但结果可能是*
  • 实现定义的行为:这是可以的,结果可能是任何*但编译器手册应该告诉你

或者,在C ++标准(N4659第3节,术语和定义)的引用中:

  

3.28未定义的行为:本国际标准没有要求的行为

     

3.29未指明的行为:行为,对于格式正确的程序构造和正确的数据,取决于实现

     

3.12实现定义的行为:行为,对于格式良好的程序构造和正确的数据,取决于实现和   每个实施文件

编辑:*正如M.M在评论中所指出的那样,未指明行为的结果可能是任何并不完全正确。事实上,正如标准本身所指出的那样,在第3.29段的说明中

  

本国际标准通常会描述可能的行为范围。

所以在实践中你已经知道可能的结果是什么,但究竟会发生什么取决于你的编译器/编译器标志/平台/等。

答案 1 :(得分:0)

未指定,其示例( &a < &b )似乎表示编译器编写者不必承诺将变量存储在堆栈中的位置,如果附加或删除了附近的项目,结果可能会改变(不更改声明a和b)。

具体实施是诸如a % b之类的项目,其结果由执行人员自行决定(通常基于硬件),以及当a为负时会发生什么。

这里描述会发生什么是很重要的,但如果标准致力于特定行为,则会影响性能。

未定义的行为描述了您的程序变得格格不入 - 它可能在特定平台上运行,但不是出于任何正当理由。