为什么不用这个代码:a [i] = i ++;工作?

时间:2012-03-30 05:57:09

标签: c

a[i] = i++;

为什么上述代码不起作用?

上面的代码有什么问题?我问这个问题是为了提高我的知识。

2 个答案:

答案 0 :(得分:9)

因为ISO标准规定您不允许多次更改变量(或更改并使用一个变量)而没有插入序列点。

i中使用a[i]ii++的更改之间没有序列点。

附件C中描述了C11的序列点列表(自C99以来没有那么多变化):

  • 在函数调用和函数调用中的实际参数的评估与实际调用之间。
  • 在以下运算符的第一个和第二个操作数的评估之间:逻辑AND&&amp ;;逻辑OR ||;逗号,。
  • 评估条件?:运算符的第一个操作数和第二个和第三个操作数中的任何一个。
  • 完整声明者的结尾:声明者;
  • 在评估完整表达式和下一个要评估的完整表达式之间。以下是完整表达式:初始化器;表达式中的表达式;选择语句的控制表达式(if或switch); while或do语句的控制表达式; for语句的每个表达式;表达式在return语句中。
  • 紧接库函数返回之前。
  • 与每个格式化输入/输出函数转换说明符关联的操作之后。
  • 在每次调用比较函数之前和之后,以及对比较函数的任何调用和作为参数传递给该调用的对象的任何移动之间。

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的哪个元素。