C++ 是不明确的行为吗?

C++ 是不明确的行为吗?,c++,language-lawyer,C++,Language Lawyer,标准上说: 1.3.24 [defns.undefined] undefined behavior behavior for which this International Standard imposes no requirements [ Note: Undefined behavior may be expected when this International Stand

标准上说:

1.3.24 [defns.undefined] undefined behavior behavior for which this International Standard imposes no requirements [ Note: Undefined behavior may be expected when this International Standard omits any explicit definition of behavior or when a program uses an erroneous construct or erroneous data. Permissible undefined behavior ranges from ignoring the situation completely with unpredictable results, to behaving during translation or program execution in a documented manner characteristic of the environment (with or without the issuance of a diagnostic message), to terminating a translation or execution (with the issuance of a diagnostic message). Many erroneous program constructs do not engender undefined behavior; they are required to be diagnosed. — end note ] 1.3.24[定义未定义] 未定义的行为 本国际标准不要求的行为 [注:当本国际标准生效时,可能会出现未定义的行为 忽略行为的任何显式定义,或者当程序使用错误的 构造或错误数据。允许的未定义行为包括忽略 结果完全不可预测的情况下,在 以文档化的方式执行的翻译或程序 环境(无论是否发出诊断消息),以 终止翻译或执行(通过发布诊断 许多错误的程序构造不会产生未定义的行为; 他们需要被诊断。 -[完注] 显然,该标准不能涵盖行为的所有可能方面。因此,如果标准没有涵盖某些内容,“可能”是未定义的行为。这到底是什么意思

这意味着,如果标准没有涵盖某些内容,就不能对其施加要求。然而,标准怎么能在没有明确说明的情况下说某件事是未定义的行为呢?从字面上讲,任何事情都可能发生在程序中,并且假设它不是未定义的行为,除非标准中这样说。这是否意味着非标准程序在默认情况下是未定义的行为


一位回答者说笔记是不规范的。答案如下:

文件正文中的注释和示例仅限于 用于提供附加信息,以帮助 理解或使用文档。它们不应包含 要求(“应”;见3.3.1和表H.1)或任何信息 被认为是使用该文件必不可少的,例如:。 说明(强制性;见表H.1)、建议(“应”; 见3.3.2和表H.2)或许可(“可”;见表H.3)。笔记 可以写为事实陈述


在我看来,省略的东西并不是严格意义上的未定义行为。例如,如果在注释中提到某个行为,它是否是严格未定义的行为?

您引用的注释的最后一句解释了第一句中的
may

许多错误的程序构造不会产生未定义的行为;他们需要被诊断

因此,梅是非常正确的

任何未定义的内容都是未定义的,尽管有很多方法可以定义它(即使它只是稍微受到限制)

此外,由于注释不规范,因此无法定义行为

然而,标准怎么能在没有明确说明的情况下说某件事是未定义的行为呢

因为这就是未定义的意思。发生了什么还没有定义。该标准定义了有效程序的期望值,它没有试图列出所有可能的无效程序,并说“这是未定义的,这也是未定义的,这也是未定义的”

该标准没有规定如果在程序运行时点燃计算机会发生什么情况。这并不意味着它定义明确。这显然没有定义

从字面上讲,任何事情都可能发生在程序中,并且假设它不是未定义的行为,除非标准中这样说

我不知道你想说什么,但听起来有180度的倒退

这是否意味着非标准程序在默认情况下是未定义的行为


什么是“非标准程序”?

正式地说,任何标准没有定义的东西都是 未定义的行为。如果标准没有定义,它是如何定义的 定义它

实际上,有两件事被视为 鉴于如果标准定义了行为,例如 实现无法添加额外的可观察行为。(即。 在像
a=2*a;
这样的语句中,实现不是 允许修改除
a
以外的任何内容,即使我认为 您将在标准中找到一个明确的段落来说明这一点。)

但仅此而已。如果标准没有定义它,它是 根据标准未定义的行为。(一) 实现可能提供进一步的定义
从图形上讲,“未定义的行为”是指“尚未定义的行为”。如果标准没有涵盖某些内容,那么可能存在编译器记录的行为(这就是为什么可能)或编译器未记录的或意外的行为(在本例中未定义)什么是“例如,如果注释中提到某个行为,那么它是严格未定义的行为?”应该是什么意思?怎么提到的?请更具体一点,很明显,在便笺中提到某件事并不意味着它是未定义的行为。什么是“例如,如果在便笺中提到某件事,它是严格未定义的行为?”应该是什么意思?怎么提到的?请说得更具体些,显然在便条中提及某件事并不意味着它是未定义的行为。我想也许你只是被便条中非正式使用的“可能”这个词挂断了,因为便条不应该说“应该”。您可以将其改写为“未定义的行为可以在…时预期”或“未定义的行为可以在…时预期”,其含义相同。这并不意味着“可能会或可能不会……”@JonathanWakely:C标准中“应”的用法与其他标准中该术语的用法不符。在正常使用中,如果X的标准规定X不能做Y,那么做Y的任何东西都不是合格的X,但C标准明确允许C程序可以合格(尽管不严格合格),即使它违反了“应”约束。此外,当标准规定通过另一种类型往返的指针“应