黑马程序员技术交流社区

标题: 大家来看个小程序 [打印本页]

作者: 821728010    时间: 2013-5-25 20:22
标题: 大家来看个小程序
本帖最后由 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,我不明白了,这个单目运算符“++”到底是怎么运行的?
作者: 张旺达    时间: 2013-5-25 20:38
给你讲个笑话吧,希望可以帮到你!
是一个关于C++的。

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

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

作者: 神之梦    时间: 2013-5-25 20:39
楼主点我的资料看下我的主题有个相类似的问题,有众多大神的回答,你可以look下
作者: 王靖远    时间: 2013-5-25 20:40
你一直J++赋给j 那么你的j就永远是J.这就和一直把j赋给j没有区别。 ++在前是先自增再赋值,++在后是先赋值再自增
作者: 穆爱明    时间: 2013-5-25 20:50
  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

作者: Changer_s    时间: 2013-5-25 20:55
本帖最后由 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 20:58
本帖最后由 秦兰之 于 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.
   
        }        

}

不知道这样算不算解决?
作者: 袁梦希    时间: 2013-5-25 21:00
本帖最后由 袁梦希 于 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以后,在虚拟机里进行自加,然后虚拟机关闭,否则偶尔会出现异常。如果有问题继续追问。

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


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

...

学长,你这样解释挺不对的!!!
我感觉你没理解其中的内涵
作者: 袁梦希    时间: 2013-5-25 21:16
Changer_s 发表于 2013-5-25 21:04
学长,你这样解释挺不对的!!!
我感觉你没理解其中的内涵

奥,那你可以说说我哪里没理解?:)
作者: Changer_s    时间: 2013-5-25 21:21
我没有任何的恶意,请不要介意我的话
我不晓得你的理解是对是错
但是你没有更好的让别人去理解这个问题,我感觉我还是不懂内部原理
但是我看了别人分布解释,我算是可以理解为什么了,当然这也都是猜测
那个学长评论我这种小问题要问老师,实际上我估计是大问题放大了???
但是我就仅仅想问问有些评论的人,请问你真的理解为什么吗?
作者: Changer_s    时间: 2013-5-25 21:23
袁梦希 发表于 2013-5-25 21:16
奥,那你可以说说我哪里没理解?

我想真正的理解,你就可以用最简单的解释告诉别人是这样理解的,但是我看到的解答过程是抽象的
作者: 张旺达    时间: 2013-5-25 21:44
Changer_s 发表于 2013-5-25 21:21
我没有任何的恶意,请不要介意我的话
我不晓得你的理解是对是错
但是你没有更好的让别人去理解这个问题,我 ...

认真你就输了
作者: Changer_s    时间: 2013-5-25 21:51
张旺达 发表于 2013-5-25 21:44
认真你就输了

看来我第一次输的好很呀!!!这次代价会让我更快的长大,呵呵,你是老江湖的
作者: Changer_s    时间: 2013-5-25 22:36
Changer_s 发表于 2013-5-25 21:51
看来我第一次输的好很呀!!!这次代价会让我更快的长大,呵呵,你是老江湖的 ...

呵呵,看来我想多了,学习少不了讨论
学长,我学习了
作者: 张旺达    时间: 2013-5-25 22:58
张旺达 发表于 2013-5-25 21:44
认真你就输了

曹哥,我错了。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2