JAVA 一个【简单&&奇怪】的赋值的问题
PHP中文网
PHP中文网 2017-04-17 13:27:04
[Java讨论组]

就是下面这段代码:

public class mian(){
int i,j=0;
for(i=0;i<10;i++){
    j=j++;
    }
   System.out.println(j);
}

然后j的输出值不是10,是0
用c语言输出10 这是怎么回事?

PHP中文网
PHP中文网

认证0级讲师

全部回复(2)
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是怎么得到的。
因为在JavaC++中左值和右值的概念是从C语言里扩展而来的,应该是向下兼容的。
所以请确认一下C语言中的结果问题。

伊谢尔伦

用gcc也是0,但倒有可能是10,依赖编译器实现。
j = j++的执行包含2次对j赋值,一次是j++,一次是j = j,如果j++j = j之前是0(因为j++的值是j,也就是j先变成j+1后,又被-1了),反之就是10。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号