区分未定义行为和格式错误
未定义行为 (UB)、格式错误和实现定义的行为是不同的概念C.然而,该标准的术语可能会令人困惑,特别是“格式错误;无需诊断”这一短语。
格式错误的程序和可诊断性
错误的-形成的程序违反了语言的语法或语义规则。根据该标准,它“否则仅被定义为格式不正确”。从逻辑上讲,这意味着格式错误的程序不应编译。
但是,该标准允许实现具有根据标准格式错误的扩展,但不会改变格式良好的程序的行为。在这些情况下,实现必须诊断扩展的使用,但允许继续执行。
未定义的行为和可诊断性
未定义的行为是指无法执行的程序行为可以通过标准来预测。实现可以自由地以任何方式定义行为,包括暂停执行或默默地忽略问题。与格式错误不同,UB 并不一定意味着程序不应该编译。
“格式错误;无需诊断”
术语“格式错误” “不需要诊断”可以解释为指程序违反语法或语义规则,但不需要实现来诊断错误的情况。这本质上使其等同于 UB,只不过实现仍然可以静默退出或继续执行。
使用这种措辞的原因可能是为了实现实现的灵活性。它使实现能够以在实践中可能有用的方式处理格式错误的错误。
结论
尽管 C 标准的措辞有时不一致,一般规则是错误或格式不正确的代码需要诊断,除非标准明确指出否则或者它是未定义的行为。在“格式错误;无需诊断”的情况下,它本质上是未定义行为的同义词,为实施者提供了处理某些错误的一定自由度。
以上是C 中未定义行为和格式错误之间有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!