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 是未定义的行为吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章