【发布时间】: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