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

来源:互联网 发布:linux 网页中文乱码 编辑:程序博客网 时间:2024/04/30 04:36

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








0 0
原创粉丝点击