A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 821728010 中级黑马   /  2013-5-25 20:22  /  2693 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 821728010 于 2013-5-29 17:37 编辑

public class Demo2 {
        
        public static void main(String[] args) {
      
                int j=1;
        j=j++;
        j=j++;
        System.out.println(j);
   
        }
        
}

上面这段代码输出1,我不明白了,这个单目运算符“++”到底是怎么运行的?

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 问的挺好的

查看全部评分

15 个回复

倒序浏览
给你讲个笑话吧,希望可以帮到你!
是一个关于C++的。

++运算符作为C++语言名称的一部分,引发了有关程序设计语言的第一个笑话。
C++的反对者认为这种语言的名称存在着bug,他们说:因为只有对它改进之后,我们才有可能使用它,所以它的名字应该命名为++C。

也就是说,如果++在前面就是先改变变量的值,再使用它;如果++在后面,就是先使用它本身的值,然后再自增,减减也一样。。

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 那会怕有哪天会挂掉噢...,oh no!.

查看全部评分

回复 使用道具 举报
楼主点我的资料看下我的主题有个相类似的问题,有众多大神的回答,你可以look下
回复 使用道具 举报
你一直J++赋给j 那么你的j就永远是J.这就和一直把j赋给j没有区别。 ++在前是先自增再赋值,++在后是先赋值再自增
回复 使用道具 举报
  1. public static void main(String[] args) {

  2.                 int i=1;
  3.                 int a=i++;
  4.                 System.out.println(a);
  5.                 int b=i++;
  6.                 System.out.println(b);
  7.         }
复制代码
你不如把代码改成这样,打个断点调试一下,就明白了!“++”在后面表示先给别人赋值,然后自己在加1;“++”在前面则相反,先给自己加1,再给别人赋值。
i先把1赋给了a,然后自加变成2.然后把2赋给了b,在自加变成了3。输出结果:1
                                                                                                           2

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 鼓励下,以后得分会难点了

查看全部评分

回复 使用道具 举报
本帖最后由 Changer_s 于 2013-5-25 20:59 编辑

好像理解了
我解释一下别人的意思:
        int i=1;
        i=i++;       (加一个中间变量去理解)  >>>>>   int temp = i ++  >>>temp = 1 and i =2>>>>> i = temp >>> i =1
       i=i++;         >>>>>   int temp = i ++  >>>temp = 1 and i =2>>>>> i = temp >>> i =1
        System.out.println(i);

懂了???
我懂了代码,但是不懂为什么要这样:++在前是先自增再赋值,++在后是先赋值再自增
这样挺容易误解的,慎重理解!!!


我感觉这个问题还是请老师专门讲解一下,毕竟很多做法都是猜测,只是有很多人的猜测符合答案而已,求群主召唤老师来权威解释一下这个问题
大家多顶顶这个问题!!!!好让老师看见这个问题

点评

这也需要叫老师,我去!老师要累死了,你说的就对  发表于 2013-5-25 21:12
回复 使用道具 举报
本帖最后由 秦兰之 于 2013-5-25 21:09 编辑

public class Demo2
{
        
        public static void main(String[] args)
        {
      
                int j=1;
                ++j;                     // 先自增1。
      
                j=j;                        //再赋值,虽然编译通过,但是提示对变量的赋值不生效。
                // j=j++;                //这个非要加的话,还是用循环吧。               
      
        System.out.println(j);        //结果输出2.
   
        }        

}

不知道这样算不算解决?

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 解释的不够完备,鼓励下

查看全部评分

回复 使用道具 举报
本帖最后由 袁梦希 于 2013-5-25 21:14 编辑

楼主你好,因为最近忙,刚才胡浩问的那个问题我也没时间回答,刚才你这题简单,我就简单的给你回答一下吧

首先,在正常运行的时候是没有问题的,这段代码我帮你用debug调试了一下,在调试完以后偶尔会出现这样的异常如下:

JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2 JDWP exit error

所以当你在调试程序的时候,应该加上一句代码:
  1. public static void main(String[] args) {

  2.              int j = 1;
  3.              j = j++;
  4.              j = j++;
  5.              System.out.println(j);
  6.              System.exit(0);//当你需要Debug看变量取值的时候需要加上这句话,这句话是关闭JVM了

  7. }
复制代码
其实这段程序没有什么特别的,i++的意思就是先进行复制再进行自加,或者先进行运算再进行自加,
就算你加再多的语句:
  1. public static void main(String[] args) {

  2. int j = 1;
  3. j = j++;
  4. j = j++;
  5. j = j++;
  6. j = j++;
  7. j = j++;
  8. System.out.println(j);

  9. }
复制代码
也就是说执行到j=1的时候,把j=j;然后程序向下执行,又把j=j;这样的程序是没有问题的,因为不用考虑j++的问题,
也可以写成:
  1. int j = 1;
  2. j = j;
  3. j = j;
  4. System.out.println(j);
复制代码
语句再多,他最后输出的还是1,当输出完1以后,在虚拟机里进行自加,然后虚拟机关闭,否则偶尔会出现异常。如果有问题继续追问。

                                                                           
__________ 菜鸟云青年为您手动解答

点评

袁版主说话就是有深度啊。。。  发表于 2013-5-25 21:42

评分

参与人数 1黑马币 +8 收起 理由
曹睿翔 + 8 有人质疑,好事!

查看全部评分

回复 使用道具 举报
袁梦希 发表于 2013-5-25 21:00
楼主你好,因为最近忙,刚才胡浩问的那个问题我也没时间回答,刚才你这题简单,我就简单的给你回答一下吧

...

学长,你这样解释挺不对的!!!
我感觉你没理解其中的内涵
回复 使用道具 举报
Changer_s 发表于 2013-5-25 21:04
学长,你这样解释挺不对的!!!
我感觉你没理解其中的内涵

奥,那你可以说说我哪里没理解?:)

点评

哈哈,其实他说的对,现在学的多了,也就忘了考虑解释问题的的通用性,以至于别人不好理解,还是老毕牛叉啊  发表于 2013-5-25 21:31
回复 使用道具 举报
我没有任何的恶意,请不要介意我的话
我不晓得你的理解是对是错
但是你没有更好的让别人去理解这个问题,我感觉我还是不懂内部原理
但是我看了别人分布解释,我算是可以理解为什么了,当然这也都是猜测
那个学长评论我这种小问题要问老师,实际上我估计是大问题放大了???
但是我就仅仅想问问有些评论的人,请问你真的理解为什么吗?
回复 使用道具 举报
袁梦希 发表于 2013-5-25 21:16
奥,那你可以说说我哪里没理解?

我想真正的理解,你就可以用最简单的解释告诉别人是这样理解的,但是我看到的解答过程是抽象的

点评

学习是一个过程,你答的就对,继续学下去,在潜移默化中你就明白了。 梦希扩展下知识,在虚拟机不正常退出时会产生奇怪的结果,为了避免加一句  发表于 2013-5-25 21:29
回复 使用道具 举报
Changer_s 发表于 2013-5-25 21:21
我没有任何的恶意,请不要介意我的话
我不晓得你的理解是对是错
但是你没有更好的让别人去理解这个问题,我 ...

认真你就输了

点评

旺达,你净瞎扯吧你  发表于 2013-5-25 22:27
回复 使用道具 举报
张旺达 发表于 2013-5-25 21:44
认真你就输了

看来我第一次输的好很呀!!!这次代价会让我更快的长大,呵呵,你是老江湖的

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 想什么呢,先精心学习

查看全部评分

回复 使用道具 举报
Changer_s 发表于 2013-5-25 21:51
看来我第一次输的好很呀!!!这次代价会让我更快的长大,呵呵,你是老江湖的 ...

呵呵,看来我想多了,学习少不了讨论
学长,我学习了
回复 使用道具 举报
张旺达 发表于 2013-5-25 21:44
认真你就输了

曹哥,我错了。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马