黑马程序员技术交流社区

标题: 运算符 疑问,关于到底输出那个【x】的值 [打印本页]

作者: 吉吉粥    时间: 2015-10-20 16:52
标题: 运算符 疑问,关于到底输出那个【x】的值
本帖最后由 吉吉粥 于 2015-10-21 15:52 编辑

/*
这个代码是逛论坛,看到的帖子自己试着敲了下,但是发现比较多的问题,【有不对的地方希望大神指教】

有点疑问,希望有大神指教下
以下是自己敲得代码,
——————————————————————
*/
package answer;

class answer2

{
         public static void main(String[] args)
         {
                 int x=5;
                 int y=0;
                 x=x++;//x赋值得到的是5
                                 y=x++;//这个是取了上面的x的结果做运算,结果是也是5(理解)
         System.out.println("x="+x+",y="+y);
         System.out.println(x);//?输出的到底是【哪个x】
         System.out.println(y);
         }
}
/*
——————————————————
结果是
x=6,y=5
6(【疑问】按我的理解这里应该也是5,可是结果是6,难道最后输出之前是作了一次加法?)
5

结果x的值跟我预想的不一致,有疑问,【思考】如下

1.单看第二步 y=x++;  取得是第一步x=x++; 中的左边x的值,就是未作加法之前直接赋值,那就是x的初始值,所以y为5。与结果一致ok。
2. 但是最后输出的x的值,得出的值是6,就是意为着x是输出的【做过一次加法】的值。
3. 【疑问】到底是哪一步?

实验
测试第一步代码结果:
——————————————————
*/
package answer;

class answer2

{
        public static void main(String[] args)
        {
                int x=5;
                int y=0;
               
                x=x++;//只运行第一步
                //y=x++;
               

        System.out.println("x="+x+",y="+y);
        System.out.println(x);//无争论的是输出了第一步左边的x的值
        System.out.println(y);
        }
}
/*
——————————————————————————————
x=5,y=0
5
0

【发现】:结果跟我想的一致,第一步输出结果确实是为5
下来那就是验证,到底是【哪一步】作了加法了,难点就是x的值到底是调用的那个值。
按理解,虽然x赋值到的是5,但毕竟之后x是做过了一次加法的就是6,难道结果是直接输出了做完一次运算的6.


下面就是又写了一些代码



*/

package answer;

class answer2

{
        public static void main(String[] args)
        {
                int x=5;
                int y=0;
               
                x=x++;//第1步
                //y=x++;
                x=x++;//第2步
                x=x++;//第3步
                x=x++;//第4步
                x=x++;//第5步
               

        System.out.println("x="+x+",y="+y);
        System.out.println(x);
        System.out.println(y);
        }
}


/*
结果
x=5,y=0
5
0

【发现】:仅仅第一步,仅仅一个变量,在没有循环的情况下,无论重复多少次,x的值始终是初始值,可理解此条代码对整个程序无意义

然后隐藏第一条代码,仅仅运行第二条代码
——————————————————————————————
*/
package answer;

class answer2

{
        public static void main(String[] args)
        {
                int x=5;
                int y=0;
                //x=x++;
                y=x++;//y取到的是x的初始值5,之后x是做了一次加法的值为6

        System.out.println("x="+x+",y="+y);
        System.out.println(x);//看结果是输出了作了加法之后的值
        System.out.println(y);
        
        }
}
/*
结果
x=6,y=5
6
5

【发现】,对结果有影响的是第二条代码,介入了第三方的变量

那我在加入些变量试下


——————————————————————————————————————————————————————————————
*/
package answer;

class answer2

{
        public static void main(String[] args)
        {
                int x=5;
                int y=0;
                int z=0;
                x=x++;//x=5 加法之前是5 【(无循环)下,始终为5】————————恶循环下 可以忽略不看
                y=x++;//y=5 加法之前是5 作了自增加x为6,——————————————————可以看作实际的“第一步”,x加了1
                z=x++;//z=6 加法之前是6 作了自增加x为7,这个7是输出了。————可以看作实际的“第二步”,x又加了1,然后输出了

        System.out.println("x="+x+",y="+y+",z="+z);
        System.out.println(x);//看结果是输出了做了加法的值,从5~7,加了2次。
        System.out.println(y);
        System.out.println(z);
        }
}
/*
结果
x=7,y=5,z=6
7
5
6


【现象】:加入一个y,得到x是6。
                                又加入一个z,得到的x是7。

【发现】:由此可以推论,就是再多加变量的话x的话也会增加。
那么我就可以认为其实第一步【x+x++;】其实是被下面的其他变量的步骤覆盖掉的,第一步运行完x的值还是5,跟初始值一致【无意义】
        真正有意义的是下面其他变量的步骤


        【结论】
                第一步:是先赋值在做加法的,把x初始值赋值给了x,得到的x是5,x++作了加法之后应该是6,但是没有体现。
                第二步:加入了第三方y,接受了x的值,y是5,x的值作了加法是6。
                第三步:加入了第四方z,接受了x加法之后的6,z为6,然后做加法为7。
x++先赋值 再做加法,当没有变量介入,在没有循环的情况下是无意义的
一旦加入变量之后,x是在栈内存在做一步一步的加法的


*/

作者: 1126634865    时间: 2015-10-20 17:32
x=x++; 先赋值x=5,后做了一次自加但并没有使用,把5传给y=x++;
y=x++;相当于y=5++;也是先赋值
sop(y);输出的是5
sop(x) ;输出的是5++自加后的结果
作者: 吉吉粥    时间: 2015-10-20 17:54
1126634865 发表于 2015-10-20 17:32
x=x++; 先赋值x=5,后做了一次自加但并没有使用,把5传给y=x++;
y=x++;相当于y=5++;也是先赋值
sop(y);输出的 ...

就是说当第三方变量介入之后, 输出的【x】,覆盖了第一步的【x】 是否可以这样理解,
即输出的【x】是最靠近输出代码的的那个【x】,就是做过加法之后的那个【x】
作者: 雨来    时间: 2015-10-20 18:02
这是主函数里的代码:
  1.        int x=5;
  2.                   int y=0;
  3.                   x=x++;//x赋值得到的是5
  4.                                   y=x++;//这个是取了上面的x的结果做运算,结果是也是5(理解)
  5.          System.out.println("x="+x+",y="+y);
  6.           System.out.println(x);//?输出的到底是【哪个x】
  7.          System.out.println(y);
复制代码

x=x++;  变量x运算后的结果是6   
其它我的也不多说,你可以用exclipse 调试一下  就明白了

作者: 1126634865    时间: 2015-10-20 18:04
没有覆盖这么一说,你只是还没明白 x=x++,这样说吧,x=5直接传给y=x++
作者: doudou966    时间: 2015-10-20 18:25
这个是赋值 x =x 然后 x+1
作者: 黑马,你的骄傲    时间: 2015-10-20 18:58
这些 问题 也 细究 过 ,说实话,谁都会晕的,不能太细究了。掌握再好再聪明的人看多了也会晕
作者: 大地z灵    时间: 2015-10-20 23:41
还有这个题也类似,
int x= 5;
x = x+(x++)+(++x);
System.out.println(x);
作者: JYcainiao    时间: 2015-10-20 23:48
你看一下这个应该就懂了
int x = 5;
int y = 0;
x=x++;  三步  第一步  x单独拿出来 值为5  第二步  x++ --> x = 6;  第三步  把第一步的值赋给x   整个表达式执行完   x = 5 将第二部x++ 的结果覆盖了
y=x++;  三步   第一步  x单独拿出来  值为5  第二步  x++ --> x = 6;  第三步  把第一步的值赋给y  整个表达式执行完  y = 5  不同的是,这里的x没有再次赋值,所以x = 6
综上所述  程序运行完  x = 6;  y = 5 ;
作者: 吉吉粥    时间: 2015-10-21 13:22
JYcainiao 发表于 2015-10-20 23:48
你看一下这个应该就懂了
int x = 5;
int y = 0;

嗯 好的
作者: polarfox17    时间: 2015-10-21 15:52
doudou966 发表于 2015-10-20 18:25
这个是赋值 x =x 然后 x+1

兄弟 照你的说法,x应该变成6了啊
作者: JYcainiao    时间: 2015-10-21 21:22
polarfox17 发表于 2015-10-21 15:52
兄弟 照你的说法,x应该变成6了啊

仔细看一下我的解释




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