黑马程序员技术交流社区

标题: 谁能用大白话和我说下i++和++i有什么区别啊?为什么会有警...? [打印本页]

作者: 葛伟    时间: 2013-3-22 08:27
标题: 谁能用大白话和我说下i++和++i有什么区别啊?为什么会有警...?
本帖最后由 葛伟 于 2013-3-22 12:51 编辑

谁能用大白话和我说下i++和++i有什么区别啊?为什么会有警告啊?如图,麻烦帮解释一下

11111.jpg (49.05 KB, 下载次数: 50)

11111.jpg

作者: 姓名长度不符    时间: 2013-3-22 08:36
i++是i的自增
i=i++,是先把i赋给i,再自增
i=++i,而是先自增,再把i赋给i,两者的影响在循环结束后结果差别很大如下:
int i=5,m;
m=(i++)+(i++);
相当于
i=5+1+1=7
m=5+6=11
如果你改成m=(++i)+(i++);
则m=6+6=12,i还是7
如果你改成m=(++i)+(++i);
则m=6+7=13,i还是7
如果你改成m=(i++)+(++i);
则m=5+7=12,i还是7
想了解透彻些的话建议看看这篇博客
http://blog.csdn.net/junsure2012/article/details/7099222
作者: 孙娜    时间: 2013-3-22 08:38
如果只看i++和++i是没有区别的都相当于i=i+1;
如果放到语句中就不同了:i++是语句执行完再做一个i=i+1的赋值,++i是在语句执行之前执行一个i=i+1语句
比如:
(1)int x=0;i=0;x=i++;先将i的值赋给x,再执行一个i=i+1。这三条语句执行完后x的值是1,i的值变成2。
(2)int x=0;i=0;x=++i;先执行一个i=i+1,再将i的值赋给x。这三条语句执行完后x的值是2,i的值也是2。
作者: 袁术森    时间: 2013-3-22 08:54
i++和++i在单条语句下 是没有区别的    都是对i进行了自增运算 所以++i本身就是对自身自增后赋值给自己 所以i=++i是没有意义的。
在参与其他运算时。++i是先自增,然后将自增后的值参与其他运算。
而i++是先将i的原值进行临时存储,然后自增,然后将临时存储的值参与其他运算。
  1. class ZizengDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int i=2;
  6.                 int x=i++;
  7.                 int y=++i;
  8.                 System.out.println("++在后 : x="+x+";++在前  :y="+y);
  9.         }
  10. }
复制代码
结果x=2,y=4
作者: 我手心里的宝    时间: 2013-3-22 08:56
以前我也纠结过 你这样理解哈  y=i++   就是先赋值 然后i再加1  这个地方死记就行了 没有为什么
至于y=++i; 就是 y就是i+1   在运算完之后 i=i+1    不管怎样i的值都是加了1 y的值呢 看看++在i之后还是之前 在前面就是先加1在赋值
在后就是先赋值  i的值再加1
窍门: 看++ 的位置在i前还是后行了
作者: 汪平乐    时间: 2013-3-22 08:58
i++  是先赋值再运算,而++i 是先运算再赋值,如 int i = 1,b=0;则b= i++ 的值是1;而b=++i 的值是2;
我用NetBeans IDE 编译了一下,发现没有警告?所以也不知道是怎么一回事.....希冀得到答案

未命名.jpg (32.63 KB, 下载次数: 80)

未命名.jpg

作者: 张昶    时间: 2013-3-22 10:31
x=i++;是语句执行之后,x的值等于i 的值,然后i 的值自增1;x=++i;是在语句执行之前,先执行一个i+1,然后把i+1的值赋给x。比如:
(1)int x=0; i=0; x=i++; 先将i 的值赋给x,再执行一个i=i+1。这三条语句执行完后x的值是0,i的值变成1。
(2)int x=0; i=0; x=++i; 先执行一个i=i+1,再将i 的值赋给x。这三条语句执行完后x的值是1,i的值也是1。
作者: 王薪婷    时间: 2013-3-22 11:28
额以前我也被这个问题纠结过,我的解决方法就是建立一个简单的程序,在主函数中就写两行代码int i=0在打印i++出来你会看到打印出来的值是0,但是如果你打印的是++i那么出来的是1,所以i++是先赋值再自增,而++i是先自增在赋值。下面也有个我发现这个问题我不太理解的小程序,希望对你理解这个有帮助。
class Instrument
{
        public void play()
        {
                System.out.println("Instrument.play()");
        }
        public String what()
        {
                return "Instrument";
        }
        public void adjust(){}
}

class Wind extends Instrument
{
        public void play()
        {
                System.out.println("Wind.play()");
        }
        public String what()
        {
                return "wind";
        }
        //public void adjust(){}
}

class Percussion extends Instrument
{
        public void play()
        {
                System.out.println("Percussion.play()");
        }
        public String what()
        {
                return "Percussion";
        }
        //public void adjust(){}
        //super.adjust;
}
class Stringed extends Instrument
{
        public void play()
        {
                System.out.println("Stringed.play()");
        }
        public String what()
        {
                return "Stringed";
        }
        //public void adjust(){}
}

class Woodwind extends Wind
{
        public void play()
        {
                System.out.println("Woodwind.play()");
        }
        public String what()
        {
                return "Woodwind";
        }
}

class Brass extends Wind
{
        public void play()
        {
                System.out.println("Brass.play()");
        }
        public void  adjust()
        {
                System.out.println("Brass.adjust");
        }
}



public class  InstrumentDemo
{
        static void tune(Instrument i)
        {
                i.play();
        }
        static void tuneAll(Instrument[] e)
        {
                for(int i=0;i<e.length;i++)
                {
                        tune(e[i]);
                }
        }
        public static void main(String[] args)
        {

                //System.out.println("Hello World!");
                //orchestra管弦乐队
                Instrument[] orchestra=new Instrument[5];
                int i=0;
                orchestra[i++]=new Wind();
                System.out.println("i="+i);
                orchestra[i++]=new Percussion();
                orchestra[i++]=new Stringed();
                orchestra[i++]=new Brass();
                orchestra[i++]=new Woodwind();
                tuneAll(orchestra);

        }
}

作者: 刘凯    时间: 2013-3-22 13:02
我想楼主对++i和i++的区别应该是知道的吧,可能问的是为啥会警告,楼上都没打到正点上啊 ,具体为啥会有警告 ,因为++x本身就是给自己自加了,你不用再重新赋值给自己,
也就是说 ++a 后 a的值就等于1了  就不用再a=了
你这样等于就相当于 a = a;   以为赋值语句是从左到右的  又因为是++a 所以是先改变值 在付给自己本身   出警告 The assignment to variable x has no effect  就是说没有什么意义  但是没有错误。  就像是x=x; 同样会显示是这个警告  但语法完全没有错误
作者: 郝强勇    时间: 2013-3-22 13:10
    没那么复杂,其实一个小例子完全能弄明白i++和++i的区别,变量i就相当于一个民工,就是先干活后给钱和先给钱后干活的问题。
    i++就是先干活后给钱,也就是执行完本句代码,在执行i=i+1,而++i就是先给钱后干活,也就是在执行本句代码之前先执行i=i+1。
作者: 葛伟    时间: 2013-3-22 13:49
郝强勇 发表于 2013-3-22 13:10:33
    没那么复杂,其实一个小例子完全能弄明白i++和++i的区别,变量i就相当于一个民工,就是先干活后给钱和先给钱后干活的问题。
    i++就是先干活后给钱,也就是执行完本句代码,在执行i=i

你这个举例形象




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