什么是"序列点"?
未定义的行为和序列点之间的关系是什么?
我经常使用有趣和复杂的表达方式a[++i] = i;,让自己感觉更好.我为什么要停止使用它们?
如果您已阅读此内容,请务必访问后续问题重新加载未定义的行为和序列点.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
C99标准以6.5.2美元计价.
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,先前的值应该只读以确定要存储的值.
(我强调)
它继续指出,以下示例是有效的(一开始看起来很明显)
a[i] = i;
Run Code Online (Sandbox Code Playgroud)
虽然它没有明确说明是什么a和i是什么.
虽然我相信它没有,但我想知道这个例子是否涵盖以下情况:
int i = 0, *a = &i;
a[i] = i;
Run Code Online (Sandbox Code Playgroud)
这不会改变值i,而是访问值i来确定放置值的地址.或者我们分配一个i已存储的值是无关紧要的i?请说清楚.
奖金问题; 怎么样a[i]++还是a[i] = 1?