黑马程序员技术交流社区

标题: 自增赋值问题 [打印本页]

作者: 单凯    时间: 2013-8-2 19:58
标题: 自增赋值问题
本帖最后由 单凯 于 2013-8-3 23:41 编辑

public         class  text
         {
                 public static void main(String[] args)
                 {
                         int x=0;x=x++;
                        System.out.println(x);
                 }
         }

输出结果为0,我想知道自增操作做哪去了?
如果改成 int a,x=0;a=x++;
输出的x就为1,也就是说自增操作其实还是做了,为何还会出现一个变量两种值?
求指教

作者: yan    时间: 2013-8-2 20:01
我的理解的是这样的:
int a=x++代表的是先赋值,再自增
此时输出的a是0,你的那个x就相当于这个a
如果是++x的话,此时的a就是1,因为这个操作时先自增再赋值

作者: 逆袭的风    时间: 2013-8-2 20:05
x=x++;
相当于
int temp=x;//读取i,准备给左侧赋值
x=x++;//x++
//右侧的操作完成
x=temp;
所以,x值还是0没有改变
作者: 夜默    时间: 2013-8-2 20:15
int a,x=0;a=x++;  此时a的值还是0  但是x++后,x自增变为1  
作者: 草帽    时间: 2013-8-2 20:15
Java中德自增自减运算符是借鉴C和C++的实现方式。
这两种(自增和自减)有两种形式,楼主使用的是运算符放在操作数后边的“后缀”形式,还有一种“前缀”形式++n,两种方式都是对变量值加一。但在表达式中,这两种形式是有区别的,前缀方式先进行+1运算;后缀方式则使用变量原来的值。
作者: 黑马王晓明    时间: 2013-8-2 20:18
  1. class Demo{
  2.         public static void main(String[] args) {
  3.                 int x=0;
  4.                 x++;
  5.                 System.out.println("x="+x);
  6.                 int y=0;
  7.                 ++y;
  8.                 System.out.println("y="+y);
  9.                 int i=0;
  10.                 System.out.println(i++);
  11.                 int j=0;
  12.                 System.out.println(++j);
  13.                
  14.         }
  15. }
复制代码
x++和++x 单独使用的时候是没有区别的 最后输出的结果都是自己自增1的结果
而如果和输出语句一起 x++ 先输出x的值 然后才会增1 而++x先自增1再输出  这就是区别
So ++ 和--  还是有用的 多用在循环中 用来给变量不断自增 自减
作者: 黑马王晓明    时间: 2013-8-2 20:19
结果为:
x=1
y=1
0
1
作者: 手心里的温柔    时间: 2013-8-2 20:23
之前有人提到过这个问题了
x=x++;这样的运算是无意义的 不能实现x的自加,而如果是y=x++;是可以实现y的赋值和x的自加一的
可以验证一下
  1. public class Test {
  2.         public static void main(String[] args)
  3.         {
  4.                 Demo.run1();
  5.   //              Demo.run2();
  6.         }
  7. }
  8. class Demo
  9. {
  10.         public static  void run1()
  11.         {
  12.                 int x = 0;
  13.                 int y;
  14.                 y=x++;
  15.                 System.out.println("y="+y+"----x="+x);
  16.         }
  17.         public static  void run2()
  18.         {
  19.                 int x = 0;
  20.                 while(x<2)
  21.                 {
  22.                         x=x++;
  23.                         System.out.println(x);
  24.                 }
  25.                 System.out.println("over");
  26.         }
  27. }
复制代码
run1()运行结果:y=0----x=1
运行run2()方法时 程序进入死循环,说明x没实现自加的功能


希望能帮到你  共同学习哈
作者: xuaner0719    时间: 2013-8-2 20:36
本帖最后由 xuaner0719 于 2013-8-2 20:38 编辑

第一情况
  1. public class Demo {

  2.         public static void main(String[] args) {
  3.                 int x = 0;
  4.                 x = x++;//后面的x没有先加1就把值赋给了前面的x,前面的x的值是0,后面的x++后x是1
  5.                 System.out.println(x);//此时x打印的是上一行前面x的值
  6.         }
  7. }
复制代码
第二种情况
  1. public class Demo {

  2.         public static void main(String[] args) {
  3.                  int a,x=0;
  4.                  a=x++;//后面的x没有先加1就把值赋给了前面的a,前面的a的值是0,后面的x++后x是1
  5.                 System.out.println(x);//此时x打印的是上一行后面x的值
  6.         }
  7. }
复制代码

作者: 645420297    时间: 2013-8-2 20:38
其实很简单 当X++ 或--单独存在下面没有语句的时候就没有意义的,前++ (++X)是先自增在出去运算,后++(x++)是出去了在回来自增,所以如果你写成
int x=0;++x;
System.out.println(x);
的话就会变成1了
作者: 单凯    时间: 2013-8-2 22:45
巩建 发表于 2013-8-2 20:15
int a,x=0;a=x++;  此时a的值还是0  但是x++后,x自增变为1

修改后的不是重点,我想问的是修改之前的部分,为何x=x++;后x的值是被赋予的0,而不是自增后的1,求解
作者: 单凯    时间: 2013-8-2 22:50
xuaner0719 发表于 2013-8-2 20:36
第一情况第二种情况

对对对,我的疑问就在这,为什么第一种情况,打印的是第一个x,而不是第二个自增的x
作者: 单凯    时间: 2013-8-2 22:54
黑马王晓明 发表于 2013-8-2 20:18
x++和++x 单独使用的时候是没有区别的 最后输出的结果都是自己自增1的结果
而如果和输出语句一起 x++ 先输 ...

“而如果和输出语句一起 x++ 先输出x的值 然后才会增1 而++x先自增1再输出  这就是区别”
x=x++;这是一条语句,system……;这是一条语句,为何第一条语句还没有执行完,就开始执行了第二个输出语句,然后再返回来执行第一条语句?
作者: xuaner0719    时间: 2013-8-2 23:05
单凯 发表于 2013-8-2 22:50
对对对,我的疑问就在这,为什么第一种情况,打印的是第一个x,而不是第二个自增的x ...

代码分解
int x = 0;
int temp = x;x = x+1;//x=x++
System.out.println(temp);
不知道你看懂没有,x是先参与运算再x自增
作者: 单凯    时间: 2013-8-3 08:46
单凯 发表于 2013-8-2 22:45
修改后的不是重点,我想问的是修改之前的部分,为何x=x++;后x的值是被赋予的0,而不是自增后的1,求解 ...

请问x=x++,这在内存里是个什么样的操作,在栈里是有2个x的空间么,如果只有一个,我觉得自增这个操作好像没有做
作者: 米中之玉    时间: 2013-8-3 10:47
单就x = x++;的结果是x的值没变,我是这么理解的:
1、赋值运算符“=”的运算顺序是先右后左;
2、等号右边:x++,x的值此时已经变成1了,但x++还是0并被CPU记录;
3、赋值运算:x=等号右边,也就是x=0;
总之,x肯定就行了加1运算,但同时x++为0的这个值肯定也被记录下来了,然后在把0给了x,也就是说x的值变了两次。
我想着应该和电脑的数据处理机制有关系吧,CPU不是有个寄存器嘛,我想应该是有些临时值放那了。

作者: masterV    时间: 2013-8-3 11:44
本帖最后由 魏先勇 于 2013-8-3 11:46 编辑

x++与++x在不进行赋值运算时没有区别,在进行赋值运算时x++先运算后自增,++x先自增再运算。我有一篇小结文章,希望对你 有帮助http://blog.163.com/xiaoran725@126/blog/static/83171870201371528368/
作者: 田磊阳    时间: 2013-8-3 19:08
本帖最后由 田磊阳 于 2013-8-3 19:17 编辑

这个要用内存的知识解释

执行X=X++的时候首先把0拷贝到了寄存器中,接着对变量X执行自加操作,X变成了1;但是下一步是把0从寄存器中拷贝回X的地址,所以X又变成了0

如果你接触过C     C++     C#你会发现结果是不一样的,所以如果不理解也不必着急~~~

作者: 李复安    时间: 2013-8-3 23:04

相信看了这张图片的解释楼主可能会明白滴、

Unnamed QQ Screenshot20130803225204.jpg (89.88 KB, 下载次数: 112)

Unnamed QQ Screenshot20130803225204.jpg

作者: 李复安    时间: 2013-8-3 23:07

http://bbs.itheima.com/forum.php ... D225%26typeid%3D225

你的与这个帖子的楼主问题的性质是一样的、
作者: 单凯    时间: 2013-8-3 23:29
本帖最后由 单凯 于 2013-8-3 23:42 编辑
田磊阳 发表于 2013-8-3 19:08
这个要用内存的知识解释

执行X=X++的时候首先把0拷贝到了寄存器中,接着对变量X执行自加操作,X变成了1; ...

嗯,我明白了,非常非常感谢




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