2012-03-30 31 views
2
a[i] = i++; 

为什么上面的代码不起作用?为什么不编码:a [i] = i ++;工作?

上述代码有什么问题?我在问这个问题,以提高我的知识。

+1

你会得到什么错误? – Habib 2012-03-30 05:58:04

+0

您声明了所有变量? – Ben 2012-03-30 05:59:14

+2

你的意思是不工作?你得到的任何错误或你没有得到预期的结果?什么是什么? – Vijay 2012-03-30 05:59:39

回答

9

由于ISO标准说你不能改变一个变量超过一次(或更改,并使用一个),中间没有序列点。

使用ia[i]ii++的变化之间没有序列点。

的序列百分点C11列表(没有真正改变,自从C99多)附录C中描述:

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

5.1.2.3 Program execution状态:当A为之前或B之后测序

评价A和B被不定测序,但它是未指定的哪个。

表达式A的评价与B之间的序列点的存在意味着,与A相关联的每一个值的计算和副作用与B相关联的每一个值的计算和副作用之前测序如果在任何排序中发生这样的未测序副作用

如果有一个表达式的子表达式的多个允许排序,其行为是未定义:

部分6.5 Expressions几乎涵盖您的具体情况。

本段描述了未定义的语句表达式,如i = ++i + 1;a[i++] = i;,同时允许i = i + 1;a[i] = i;

1

它确实有效,但可能并不如预期。问题是如果不清楚i是否在赋值之前递增,如果是,则a[i]将引用数组中的下一项。

你的问题非常简洁,所以如果你想了解更多信息,你可以扩展它。但很难确切地说明语法分配给哪个元素a

+0

不,它不起作用。它是*未定义的行为*。 – 2012-03-30 06:01:06

+3

@亚当:只是因为它的行为不是由标准定义的,几乎意味着它不起作用。根据实施情况,它可能工作得很好。 (不要忽视*不起作用的事实*是一个可怕的解释,不应该被试图描述技术问题的开发人员使用。) – 2012-03-30 06:03:04

相关问题