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; }