维基百科有关于undefined和unspecified行为的网页,其中的链接在此处的评论和答案中得到充分利用。
每一个都以的注释开头,不要与其他混淆,但除了一个没有非常明确的句子,他们没有指出它们之间的区别。
其中一个给出了一个示例(比较2个变量的地址:&a < &b
)和注释,这将导致C ++中未指定的行为,在C 中未定义。
是否可以以明确,易懂的方式查明未定义和未指定行为之间的重大差异 ?
答案 0 :(得分:13)
简而言之:
或者,在C ++标准(N4659第3节,术语和定义)的引用中:
3.28未定义的行为:本国际标准没有要求的行为
3.29未指明的行为:行为,对于格式正确的程序构造和正确的数据,取决于实现
3.12实现定义的行为:行为,对于格式良好的程序构造和正确的数据,取决于实现和 每个实施文件
编辑:*正如M.M在评论中所指出的那样,未指明行为的结果可能是任何并不完全正确。事实上,正如标准本身所指出的那样,在第3.29段的说明中
本国际标准通常会描述可能的行为范围。
所以在实践中你已经知道可能的结果是什么,但究竟会发生什么取决于你的编译器/编译器标志/平台/等。
答案 1 :(得分:0)
未指定,其示例( &a < &b )
似乎表示编译器编写者不必承诺将变量存储在堆栈中的位置,如果附加或删除了附近的项目,结果可能会改变(不更改声明a和b)。
具体实施是诸如a % b
之类的项目,其结果由执行人员自行决定(通常基于硬件),以及当a为负时会发生什么。
这里描述会发生什么是很重要的,但如果标准致力于特定行为,则会影响性能。
未定义的行为描述了您的程序变得格格不入 - 它可能在特定平台上运行,但不是出于任何正当理由。