java中的 i++ 与 C中的 i++ 的区别

时间:2020-12-28 02:13:05

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