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

C++ 未定义与未指定与实现定义的行为,c++,c,C++,C,Wikipedia有关于和行为的页面,在这里的评论和回答中,它们的链接被大量使用 每一个都以一个音符开始,以免与另一个音符混淆,但除了一个没有非常清晰的句子外,他们没有指出它们之间的区别 其中一个例子(比较2个变量的地址:和A

Wikipedia有关于和行为的页面,在这里的评论和回答中,它们的链接被大量使用

每一个都以一个音符开始,以免与另一个音符混淆,但除了一个没有非常清晰的句子外,他们没有指出它们之间的区别

其中一个例子(比较2个变量的地址:<代码>和A <和B<代码>),注释将导致C++中未指定的行为,在C.

中未定义。 是否有可能以一种清晰、易懂的方式精确指出未定义和未指定行为之间的实质性差异?

简言之:

  • 未定义的行为:这样做不好
  • 未指明的行为:这是可以做的,但结果可能是任何事情*
  • 实现定义的行为:这是可以做到的,结果可能是任何东西*但是编译器手册应该告诉您

或,从C++标准(第3节,术语和定义)引用:

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

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

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


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

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


因此,在实践中,您对可能的结果有些了解,但具体发生的情况取决于编译器/编译器标志/平台等。

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

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

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


未定义的行为描述的是您的程序格式错误的点-它可能在特定的平台上工作,但没有任何好的理由。

使用哪种语言规范?这些术语的含义在C和C++语言规范中有明确的定义。它们的含义在C和C++中是否不同?这能回答你的问题吗?@北方人,很好的链接,谢谢。很好的回答,向上投票。但是仍然有一些不清楚的地方:3.28-没有要求。这是否意味着对于3.29和3.12有一些要求?我可以要求你们仔细地指定您使用的C++标准(以及如果可能的话)提供链接到它?@ MaRand这些引用是从最新的C++ 17草案标准中提取的,(尽管)我认为它们与C++中的早期版本没有任何不同。在未指定行为的情况下,标准实际上给出了哪些行为是可能的,这取决于实现选择一个(因此,“部分指定”可能是一个更好的术语,但“未指定”现在仍然存在)。谢谢!也许你可以把它包括在你的答案中。