C++ 是不明确的行为吗?
标准上说: 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[定义未定义] 未定义的行为 本国际标准不要求的行为 [注:当本国际标准生效时,可能会出现未定义的行为 忽略行为的任何显式定义,或者当程序使用错误的 构造或错误数据。允许的未定义行为包括忽略 结果完全不可预测的情况下,在 以文档化的方式执行的翻译或程序 环境(无论是否发出诊断消息),以 终止翻译或执行(通过发布诊断 许多错误的程序构造不会产生未定义的行为; 他们需要被诊断。 -[完注] 显然,该标准不能涵盖行为的所有可能方面。因此,如果标准没有涵盖某些内容,“可能”是未定义的行为。这到底是什么意思 这意味着,如果标准没有涵盖某些内容,就不能对其施加要求。然而,标准怎么能在没有明确说明的情况下说某件事是未定义的行为呢?从字面上讲,任何事情都可能发生在程序中,并且假设它不是未定义的行为,除非标准中这样说。这是否意味着非标准程序在默认情况下是未定义的行为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
一位回答者说笔记是不规范的。答案如下: 文件正文中的注释和示例仅限于 用于提供附加信息,以帮助 理解或使用文档。它们不应包含 要求(“应”;见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程序可以合格(尽管不严格合格),即使它违反了“应”约束。此外,当标准规定通过另一种类型往返的指针“应