java中:
采用中间变量机制:
i = i++;相当于:
temp = i;
i = i + 1;
i = temp; (即i = i++ = temp)## 注:在二元操作符(“=”、“+”)对应的指令生成之前生成一个自增指令(即:在 “+” 和 “=” 运算执行前,就已经自增了)。##
问题实质:在java中,执行自增运算时,会为每一个自增操作分配一个临时变量,如果是前缀加(++i),就会“先自加1后赋值(给临时变量)”;如果是后缀加(i++),就会“先赋值(给临时变量)后自加1”。运算最终使用的,并不是变量本身,而是被赋了值的临时变量。
=================================================================================================
int a = 0,sum;java中,是使用完 a++ 这个表达式后,a立即加一;
对于sum = a++ + a++;java中:第一个a++执行完后,a的值立即加一变成1,在第二个a++执行之前,a的值为1
a = 0;
a = a++ + a++;temp1 = a; --> temp1 == 0;
a = a+1;
temp2 = a; --> temp2 == 1;
a = a+ 1;
a = temp1 + temp2;
=================================================================================================
int a = 0, sum;
a = a++;
System.out.println(a);结果是:0 注:变量 a 的值的变化过程是:0 --> 1 --> 0 (初始化为0 --> a自增为1 --> 把临时变量的值 1 赋值给a)
------------------------------------------------------------------------------------------------------------------------------------------int a = 0, sum;
sum = a++ + a++;
System.out.println(sum);
System.out.println(a);结果是:1和2
--------------------------------------
int a = 0, sum;a = a++ + a++;
System.out.println(a);
结果是:1
--------------------------------------
int a,sum;
a = 0;sum = a++ + ++a;
System.out.println(sum);
System.out.println(a);结果是:2和2
================================================================================================================
C语言中:
++ 是一元运算符:+ 与 = 都是二元运算符
对于一元操作符来说,其返回值为:i++为i的值,++i是i加一后的值
i++ 操作意味着 在二元操作符对应的指令生成之后再生成一个自增指令(即:在 “+” 和 “=” 运算都结束后,才自增)。
++i 操作意味着 在二元操作符对应的指令生成之前生成一个自增指令(即:在 “+” 和 “=” 运算执行前,就已经自增了)。
================================================================================================================
int i = 0, sum;// 测试一元运算符
若 printf("%d", i); 结果是:0
若 printf("%d", i++); 结果是:0
若 printf("%d", ++i); 结果是:1
----------------------------------------------------------------------
int i = 0, sum;// 测试二元运算符
sum = i++;
printf("%d", sum);
printf("%d", i);结果是:0和1
若改为:
i = i++;
printf("%d",i);则结果是:1
----------------------------------------------------------------------
int a = 0, sum;
sum = a++ + a++;printf("%d\n",sum);
printf("%d\n",a);结果是:0和2
分析:
先执行第一个a++(此时,a的值为0),
再执行第二个a++(此时,a的值为0),
最后执行加法运算和赋值运算(此时,a的值为0,sum的值为 0 + 0 = 0),
加法运算结束后,执行a的两次加一动作(此时a的值为2)
若改为:
a = a++ + a++;
printf("%d", a);
则结果是:2
----------------------------------------------------------------------
int a = 0,sum;a = a++ + ++a;
printf("%d\n",a);过程:
首先,a 自增1,这是由 ++a 带来的(即使 a++ 在最左边)。这时 a = 1然后,我们计算 + 号的两个操作数。
因为它们其实都是 a(这里就涉及到编译器实现的问题了,大多数C编译器会将这两个操作数合并,即都是变量a),
值都为1,这样的话 a++ + ++a 的返回值是1+1=2,接着把 a++ + ++a 的值赋值给a,此时 a = 2最后,完成 a++ 带来的自增指令,此时 a 的值为 2+1=3,这是 a = 3
结果是:3
若改为:
sum = a++ + ++a;
printf("%d",sum);
printf("%d", a);
过程:
首先,a 自增1,这是由 ++a 带来的(即使 a++ 在最左边)。这时 a = 1然后,然后,我们计算 + 号的两个操作数。
因为它们其实都是 a(这里就涉及到编译器实现的问题了,大多数C编译器会将这两个操作数合并,即都是变量a),
值都为1,这样的话 a++ + ++a 的返回值是1+1=2,接着把 a++ + ++a 的值赋值给sum,此时 sum = 2,a = 1最后,完成 a++ 带来的自增指令,此时 a 的值为 1+1=2,这是 a = 2
结果为:2和2
================================================================================================================
a = a++ ++a; 在 java 中和 C 中的区别
java 中,先执行 a++,
C中,先执行 ++a