-2

在 C++ 中,有些东西出现在定义明确和未定义之间。具体来说,它们被称为实现定义未指定。现在,我对未指定的东西很感兴趣。

什么时候可以使用这些功能,什么时候应该避免使用?有没有很好的例子说明未指定的行为是正确代码的一部分?编写软件时,什么时候是最好的选择?

Matt McNabb 提供的定义:

  • 未定义 - 任何事情都可能发生

  • 实现定义 - 有限数量的结果是可能的,编译器的文档必须说明会发生什么

  • 未指定- 有限数量的结果是可能的 - 通常标准描述一组可能的结果

  • 定义明确 - 以上都不是

  • 格式良好的程序 - 编译时没有错误的程序(可能表现出未定义的行为)

后续问题:

宽松的原子算作未指定的还是明确定义的?

标记为从不同角度讨论相同想法的问题的副本。标记为相同的问题讨论了未指定行为的定义,而这里的问题是关于如何以及何时使用它。

4

1 回答 1

6

要回答新问题,“什么时候可以使用未指定的行为?”

这听起来可能有点滑稽,但“任何时候发生哪种选择对你来说都无关紧要”。

例如,

int foo() { cout << "foo"; return 1; }
int bar() { cout << "bar"; return 2; }
// ...
cout << (foo() + bar()) << "\n";

如果您不在乎看到的是“foobar3”还是“barfoo3”,那么您可以编写此代码。如果它确实重要,那么你将不得不改变它,例如

int i = foo(); i += bar(); cout << i << "\n";

该顺序未指定,因为在更一般的情况下,最好让编译器自由选择最佳顺序。

于 2014-07-17T22:44:54.690 回答