a[i] = i++;
为什么上述代码不起作用?
上面的代码有什么问题?我问这个问题是为了提高我的知识。
答案 0 :(得分:9)
因为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;
。
答案 1 :(得分:1)
它确实有效,但可能不如预期的那样。问题是如果不清楚i
在赋值之前是否增加了,如果是,那么a[i]
将引用数组中的下一个项目。
您的问题非常简洁,因此如果您想了解更多信息,可以展开它。但是很难确切地说出语法分配给a
的哪个元素。