C 中的 sum+++i 是未定义的行为吗? [复制]

Posted

技术标签:

【中文标题】C 中的 sum+++i 是未定义的行为吗? [复制]【英文标题】:Is sum+++i undefined behavior in C? [duplicate] 【发布时间】:2014-11-18 10:31:16 【问题描述】:

我在不同的机器和不同的编译器上对此进行了测试,但我给出了相同的输出:

int sum = 10, i = 5;
printf("%d", sum+++i);

这是在 C 中明确定义还是未定义的行为?

【问题讨论】:

请在 Stack Overflow 上搜索“maximum munch”,会发现大量重复项。 @KerrekSB 它出于正确的原因关闭。它得到了别人的1次混淆重复投票,然后真诚地欺骗了你的锤子。也许这是一个网站设计错误,它应该只显示获得最多票数的副本。 与Why doesn't a+++++b work in C?相关 @george-stocker 我认为 duplicte 是一个非常糟糕的问题,它基本上是对后增量如何工作的混淆,按照今天的标准,这是离题的,我个人会这样关闭它。这个question 实际上更接近,this question 也不是一个更普遍的适合,如果可能的话,我会选择关闭它。 @ShafikYaghmour 谢谢;固定的。我不是 C++ 专家,所以我的目标是按原样进行设置。跟踪所有线程令人困惑。 【参考方案1】:

定义明确。 sum+++i 被解析为sum++ + i,结果为15(具有递增sum 的副作用)。

C11 §6.4 词法元素

如果输入流已被解析为预处理标记,直到给定字符,则 下一个预处理标记是最长的字符序列,可以构成一个 预处理令牌。此规则有一个例外:标头名称预处理标记仅在 #include 预处理指令内和在 #pragma 指令内的实现定义位置中被识别。在这种情况下,可以是标题名称或字符串文字的字符序列被识别为前者。

还有一个类似的例子:

示例 2 程序片段 x+++++y 被解析为 x ++ ++ + y,这违反了对增量运算符的约束,即使解析 x ++ + ++ y 可能会产生正确的表达式。

【讨论】:

我可以知道你从哪里得到这些信息吗? (+1 最佳答案:D) @YuHao:关键是,这个程序即使你从来没有编译过,也是定义良好的。即使你把它写在一个孤岛上的纸上,它也会是具有可预测语义的格式良好的 C。为什么要剥夺我们的洞察力? @KerrekSB 好点。我会编辑帖子而不是责怪编译器:) 谢谢 - 投赞成票。 @Rizier123 引用自 C 标准。您可能对Where do I find the current C or C++ standard documents? 感兴趣【参考方案2】:

此声明

printf("%d", sum+++i);

对应

printf("%d", sum++ + i);

并且是一个格式良好的陈述。没有任何未定义的行为。

输出将是

15

根据 C 标准(6.4 词法元素)

4 如果输入流已被解析为预处理标记 给定字符,下一个预处理标记是最长的 可以构成预处理标记的字符序列

【讨论】:

能否请您添加一行关于为什么解释不会像printf("%d", sum + ++i); @SouravGhosh 因为LTR 而不是RTL @Rizier123 非常感谢。我现在明白了。 @SouravGhosh 作为特别提示:阅读余浩的答案,解释得很好

以上是关于C 中的 sum+++i 是未定义的行为吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中删除空指针是不是被认为是未定义的行为? [复制]

不调用对象的析构器是未定义的行为吗?

C ++中的内存泄漏“未定义行为”类问题吗?

计算地址差异是未定义的行为吗?

删除 null void* 指针是未定义的行为吗?

如果 a 未初始化,a^a 或 a-a 是未定义的行为吗?