扫码关注官方订阅号
就是下面这段代码:
public class mian(){ int i,j=0; for(i=0;i<10;i++){ j=j++; } System.out.println(j); }
然后j的输出值不是10,是0 用c语言输出10 这是怎么回事?
认证0级讲师
@SegmentSuccess 我来回答一下
这个问题跟左值(lvalue)右值(rvalue)有关。j++是一个右值,而++j是一个左值。
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=j++
而++j是一个左值, 左值意味着,这个时候++j返回的是执行了+1操作以后的j。因此,当j=j++操作的时候,其实等同于j=j(这是多余的行为)。 所以,如果写成j=++j那么输出就是10。
j=j
j=++j
10
另外,用c实现的程序输出也是0,不知道你问题中的10是怎么得到的。 因为在Java和C++中左值和右值的概念是从C语言里扩展而来的,应该是向下兼容的。 所以请确认一下C语言中的结果问题。
0
Java
C++
用gcc也是0,但倒有可能是10,依赖编译器实现。j = j++的执行包含2次对j赋值,一次是j++,一次是j = j,如果j++在j = j之前是0(因为j++的值是j,也就是j先变成j+1后,又被-1了),反之就是10。
j = j++
j = j
j+1
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
@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语言中的结果问题。
用gcc也是0,但倒有可能是10,依赖编译器实现。
j = j++的执行包含2次对j赋值,一次是j++,一次是j = j,如果j++在j = j之前是0(因为j++的值是j,也就是j先变成j+1后,又被-1了),反之就是10。