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

时间:2013-07-16 19:07:56

标签: java c expression post-increment pre-increment

请考虑以下声明:

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 <stdio.h>
            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);
     }
}

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

#include <stdio.h>
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;
}

答案 2 :(得分:2)

关于来自c99 draft standard 6.5.2

的C.
  

在上一个和下一个序列点之间,对象应具有其存储值   通过表达式的评估最多修改一次。此外,先前的价值   应该只读以确定要存储的值。

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

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

draft 2011 standard中的部分也是一样的,但它看起来有点尴尬。这是sequence point的一个很好的参考。

15.7部分是JLS

的相关部分
  

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

     

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