4

请考虑以下声明:

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 中递增和递减运算符的工作方式有什么不同吗和爪哇。

这是我的确切 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);
     }
}
4

3 回答 3

3

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

于 2013-07-16T19:10:47.550 回答
2

为了补充 Rohit 的答案,如果您分别执行每个步骤,则会给出答案 10。这只是强调了执行i++并且++i可能不会按照将参数添加到 value 的顺序发生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;
}
于 2013-07-16T19:21:48.837 回答
2

关于c99 标准草案 6.5.2中的 C :

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

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

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

该部分在2011 年标准草案中也是相同的,但读起来有点尴尬。这是关于sequence point的一个很好的参考。

部分15.7是来自的相关部分JLS

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

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

于 2013-07-16T19:35:00.477 回答