就是下面这段代码:
public class mian(){ int i,j=0; for(i=0;i<10;i++){ j=j++; } System.out.println(j); }
然后j的输出值不是10,是0
用c语言输出10 这是怎么回事?
用gcc也是0,但倒有可能是10,依赖编译器实现。j = j++
的执行包含2次对j
赋值,一次是j++
,一次是j = j
,如果j++
在j = j
之前是0(因为j++
的值是j
,也就是j
先变成j+1
后,又被-1了),反之就是10。
@SegmentSuccess
我来回答一下
这个问题跟左值(lvalue)右值(rvalue)有关。j++
是一个右值,而++j
是一个左值。
右值意味着j++
做了两件事:
1、将存储在j
中的变量变为+1以后的值;
2、返回一个临时变量(也就是右值),这个临时变量里存储的是j
原来的值;
这也是为什么有种说法叫:j++
是“先使用j再++”,而++j
是“先++再使用j”的原因。(顺便说一下,我总觉得这句话是用来误导人的)
因此j=j++
这个赋值操作会一直将临时变量里的值赋给等式左边的j
。
也就是说,j++
执行完了以后,j
确实是+1了,但是j=j++
这个赋值操作,却将j
+1之前的值重新赋给了j
。所以,j
会一直保持初始值不变。
而++j
是一个左值,
左值意味着,这个时候++j
返回的是执行了+1操作以后的j
。因此,当j=j++
操作的时候,其实等同于j=j
(这是多余的行为)。
所以,如果写成j=++j
那么输出就是10
。
另外,用c实现的程序输出也是0
,不知道你问题中的10
是怎么得到的。
因为在Java
和C++
中左值和右值的概念是从C语言里扩展而来的,应该是向下兼容的。
所以请确认一下C语言中的结果问题。