【问题标题】:Does int a=1, b=a++; invoke undefined behavior?int a=1, b=a++;调用未定义的行为?
【发布时间】:2013-04-19 14:28:46
【问题描述】:

int a=1, b=a++; 会调用未定义的行为吗? a 的初始化及其在b 的初始化程序中的访问和修改之间没有序列点干预,但据我所知,初始化不是对象的“修改”;指定一个初始化器来给出对象的“初始值”。根据 6.7.8 初始化,第 8 段:

初始化器指定存储在对象中的初始值。

并且在对对象进行任何访问之前将“初始”作为排序似乎是合理的。以前是否考虑过这个问题,是否有公认的解释?

【问题讨论】:

  • @quetzalcoatl AFAIK,新的 C 标准已经被批准,序列点的概念还没有过时,并且在第 6.11 节“未来语言方向”中没有提到任何关于序列点的计划。你从哪里得到这些信息的?你确定你不是在谈论 C++?
  • 哦,天哪.. 确实,我的意思是 C++。我没有注意到 C 语言,或者更确切地说,我无意中添加了 ++。无论如何,如果你也对它感兴趣,那么我刚刚完成了线程的挖掘并找到了讨论:stackoverflow.com/a/15248697/717732。有趣的是,脚注编号是相同的;)哦,天哪。今天不是我的日子.. 可能 KerrekSB 也意味着 C++ 中的 #97!
  • 这很重要吗? int a=2, b=2; 似乎更短更安全。
  • @quetzalcoatl - 不。如果代码太复杂以至于我们必须讨论结果是什么,如果有,我们就不应该使用它。尤其是当有更简单的版本时,例如int a=2, b=2;,它对每个人来说都更短且显而易见。 IOCCC 有时有点有趣,但并不重要。
  • @BoPersson 应该避免多少这样的代码,即使你误读了它也很好地说明了这一点:它的结果与int a = 2, b = 1;的结果相同。

标签: c language-lawyer undefined-behavior sequence-points


【解决方案1】:

它不会调用未定义的行为。 6.7.6(3)中规定

完整的声明符是不属于另一个声明符的声明符。一个完整的结束 声明符是一个序列点。

完整声明符的结尾是一个序列点。

int a = 1, b = a++;
     //  ^ end of full declarator

【讨论】:

  • '6.7.6 (3)'
  • 标准第 6.7.6 节第 3 段(嗯,N1570 草案,因为我没有钱购买昂贵的标准,我不真的 需要)。该部分处理声明符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 2013-04-24
  • 2015-11-16
  • 2012-08-01
  • 1970-01-01
  • 2015-03-20
  • 2010-10-11
相关资源
最近更新 更多