请考虑以下声明:
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);
}
}
答案 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
:
在上一个和下一个序列点之间,对象应具有其存储值 通过表达式的评估最多修改一次。此外,先前的价值 应该只读以确定要存储的值。
它引用以下代码示例为未定义:
i = ++i + 1;
a[i++] = i;
draft 2011 standard中的部分也是一样的,但它看起来有点尴尬。这是sequence point的一个很好的参考。
第15.7
部分是JLS
:
Java编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右。
建议代码不要严格依赖此规范。当每个表达式最多包含一个副作用时,代码通常更清晰