尽管在 SO 上有很多关于这个主题的链接,但我认为缺少一些东西:用通俗易懂的语言清楚地解释未指定行为(UsB)、未定义行为(UB) 和实现定义行为(IDB ) 之间的区别) 对任何用例和示例进行详细而简单的解释。
注意:我做了UsB的首字母缩写词,但不要期望在其他地方看到它。
我知道这可能看起来与其他帖子重复(更接近的是这个),但在有人将其标记为重复之前,请考虑一下我已经找到的所有材料有什么问题(我将来自这篇文章的社区 WIKI):
太多分散的例子。当然,例子还不错,但有时找不到一个能很好地解决他手头的问题的例子,所以它们可能会令人困惑(尤其是对于新手来说)。
示例通常只是很少解释的代码。在这些微妙的问题上,尤其是对于(相对)新手来说,更自上而下的方法可能会更好:首先是带有抽象(但不是合法的)描述的清晰、简单的解释,然后是 一些简单的例子,解释为什么它们会触发某些行为.
有些帖子经常混合使用 C 和 C++ 示例。C 和 C++ 有时在他们认为的 UsB、UB 和 IDB 上不一致,因此对于不精通这两种语言的人来说,一个示例可能会产生误导。
当给出 UsB、UB 和 IDB 的定义时,通常是对标准的简单引用,对于新手来说有时可能不清楚或太难消化。
有时对标准的引用是部分的。许多帖子仅引用对手头问题有用的部分的标准,这很好,但缺乏通用性。此外,标准的引用通常没有任何解释(对初学者不利)。
由于我自己不是这个主题的超级专家,所以我将创建一个社区 WIKI,以便任何有兴趣的人都可以贡献和改进答案。
为了不破坏我创建结构化的初学者友好 WIKI 的目的,我希望海报在编辑 WIKI 时遵循一些简单的准则:
对您的用例进行分类。如果适用,请尝试将您的示例/代码放在现有类别下,否则创建一个新类别。
首先是简单的文字描述。首先用简单的词语描述(当然不要过度简化——质量第一!)你试图提出的例子或观点。然后放代码示例或引用。
通过引用引用标准。不要发布各种标准的片段,但要给出明确的参考(例如 C99 WG14/N... 第 1.4.7 节,第 ...),并尽可能发布相关资源的链接。
更喜欢免费的在线资源。如果你想引用书籍或非免费资源,那没关系(并且可能会提高 WIKI 的质量),但也可以尝试添加一些免费资源的链接。这对于 ISO 标准尤其重要。欢迎您添加指向官方标准的链接,但也尝试添加指向免费草稿的等效链接。并且请不要将草稿链接替换为对官方标准的引用,添加到它们中。甚至一些大学的一些计算机科学系也没有 ISO 标准的副本,更不用说大多数程序员了!
除非真的有必要,否则不要发布代码。仅当仅使用简单英语的解释会尴尬或不清楚时才发布代码。尝试将代码示例限制为单行。而是发布指向其他 SO Q&A 的链接。
不要发布 C++ 示例。我希望这成为 C 的一种常见问题解答(如果有人想为 C++ 启动一个双线程,那就太好了)。欢迎与 C++ 的相关差异,但仅作为旁注。那是在您彻底解释 C 案例之后,您可以添加一些关于 C++ 的语句,如果这对 C 程序员切换到 C++ 时有所帮助,但我不想看到超过 20% 的 C++ 内容的示例。通常像“(C++ 在这种情况下表现不同)”这样的简单注释加上相关链接就足够了。
由于我对 SO 还很陌生,因此我希望通过这种方式开始问答不会违反任何规则。对不起,如果是这种情况。欢迎模组让我知道。