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

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

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

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

【问题讨论】:

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

标签: c language-lawyer undefined-behavior


【解决方案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 作为特别提示:阅读余浩的答案,解释得很好
猜你喜欢
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多