a[i] = i++;
Run Code Online (Sandbox Code Playgroud)
为什么上面的代码不起作用?
上面的代码有什么问题?我问这个问题是为了提高我的知识水平.
因为ISO标准规定不允许多次更改变量(或更改并使用一个变量)而没有中间序列点.
还有就是利用之间没有顺序点i在a[i]和变化i中i++.
附件C中描述了来自C11的序列点列表(自C99以来没有那么多变化):
并5.1.2.3 Program execution指出:
当A在B之前或之后进行测序时,评估A和B是不确定的,但是未指定哪一个.
在表达式A和B的评估之间存在序列点意味着在与B相关联的每个值计算和副作用之前,对与A相关联的每个值计算和副作用进行排序.
部分6.5 Expressions几乎涵盖了您的确切案例:
如果表达式的子表达式有多个允许的排序,则如果在任何排序中发生这种未测序的副作用,则行为是不确定的.
此段落呈现未定义的语句表达式,例如
i = ++i + 1;和a[i++] = i;允许i = i + 1;和a[i] = i;.