C和JAVA中递增递减运算符的差异

请考虑以下声明:

int a[]={1,2,3,4,5,6,7,8}; int i=0,n; n=a[++i] + i++ + a[i++] + a[i] ; 

根据我的逻辑,n应该是10.但是我在c中得到不同的输出(输出是7)但是在java中我得到的预期结果是10.在增量和减量运算符在c中工作的方式有什么不同和java。

这是我的确切c和java代码:

  #include  int main() { int a[]={1,2,3,4,5,6,7,8}; int i=0,n; n=a[++i] + i++ + a[i++] + a[i] ; printf("%d",n); getch(); return 0; } 

输出的Java代码:10

 public class HelloWorld{ public static void main(String []args){ int a[]={1,2,3,4,5,6,7,8}; int i=0,n; i=0; n=a[++i] + i++ + a[i++] + a[i] ; System.out.println(n); } } 

关于c99 草案标准 6.5.2 C:

在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次。 此外,先前的值应该是只读的,以确定要存储的值。

它引用以下代码示例为未定义:

 i = ++i + 1; a[i++] = i; 

该部分在2011年标准草案中也是相同的,但它看起来有点尴尬。 这是序列点的一个很好的参考。

15.7节是JLS的相关部分:

Java编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右。

建议代码不要严格依赖于此规范。 当每个表达式包含至多一个副作用时,代码通常更清晰

C ,这是一个未定义的行为。 由于C不保证表达式中单个操作的评估顺序。

要添加到Rohit的答案,如果分别执行每个步骤,则给出答案10。 这只是强调了i++++i的执行可能不会按照参数添加到值n的顺序发生。

 #include  int main() { int a[]={1,2,3,4,5,6,7,8}; int i=0,n; n=a[++i] + i++ + a[i++] + a[i] ; printf("%d\n",n); i=0; n=0; n=a[++i]; printf("%d\n",n); n+=i++; printf("%d\n",n); n+=a[i++]; printf("%d\n",n); n+=a[i]; printf("%d\n",n); return 0; }