JAVA 一个【简单&&奇怪】的赋值的问题

 KX林 发布于 2022-11-05 16:26

就是下面这段代码:

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

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

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

    2022-11-12 01:48 回答
  • @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语言中的结果问题。

    2022-11-12 01:48 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有