黑马程序员技术交流社区
标题: ++的问题 [打印本页]
作者: idream 时间: 2014-4-20 22:13
标题: ++的问题
本帖最后由 idream 于 2014-4-20 22:57 编辑
public static void main(String[] args) {
int i = 3;
i = i++;
System.out.println("i="+i);//结果为何是3,而不是4呢?
}
作者: 悠然丶 时间: 2014-4-20 22:29
这个问题很简单,先看后++就是你这种情况
i = i++; //后++会把i的值赋给i在回来自己自增一次
如果是 i = ++i; //先++,i会先自增然后再赋值给i;
那么输出结果就是4了
应该很好理解吧 ,另外毕老师视频里有讲的很明白 你回去看看在 加油!
作者: ☆枫の云 时间: 2014-4-20 22:29
本帖最后由 ☆枫の云 于 2014-4-20 22:34 编辑
这个问题很简单啦,视频上毕老师说的很清楚,关于b=a++;和b=++a;的区别,
很简单你看哪个离等号近,就先执行什么,b=a++就是先把a的值赋给b再自己++,
而b=++a则是先++然后再赋值给b
作者: 蔡先苼 时间: 2014-4-20 22:36
++是自增运算符,++在前和在后是不一样的,++在后表示先参与运算再自增1,++在前表示先自增1再参与运算,在本例中:输出的是i++,先参与运算再自增1,所以结果应是3,而不是4。
作者: 孟祥钰 时间: 2014-4-20 22:37
i = i++; 是先将i的值赋值给i,然后在进行自增,自增的结果并没有进行赋值。所以结果是3。
如果是i=++i; 那就是先进行自增,然后把自增后的值赋给i。这样的情况下结果就是4了。
作者: 四川男人 时间: 2014-4-20 22:44
int i = 3;
i = i++; // ++在右边,先赋值再自加 结果是i =3 system输出3,然后执行++,i=4;
System.out.println("i="+i);
作者: peku 时间: 2014-4-20 22:46
举个例子
int a,b=1;
a=b++;/*因为这句话程序的实现最终是通过内存来实现的,在java中这句话真正的执行顺序是将b的值取出来放入内存的另外一个地方我们称这个地方为临时的C,然后将b的值加1,最后再将C中的值赋给a,将b换成a,这样就可以知道:
int a=1;
a=a++;其实是将进行了C=a->a++->a=C的动作,所以相当于兜了一圈又回来了
作者: 陨落″烟雨。 时间: 2014-4-20 22:49
请记住:++在后面就先用变量在自加1,++在前就先自加1再用!哦也!!
作者: 千殇轮回 时间: 2014-4-20 22:57
这个问题就是关于前++和后++的区别
i = i++; 后++会把i的值赋给i后,自己自增一次
i = ++i; 前++,i会先自增一次,然后再赋值给i
作者: tacyjay在路上 时间: 2014-4-20 23:21
本帖最后由 tacyjay在路上 于 2014-4-20 23:30 编辑
了解了一下,这个问题,并没有看起来的那么简单,涉及到java的编译机制(参考下面的那篇文章),。
其实楼主想实现的应该是这个i++;语句的这个功能吧,可是“错”写成了i=i++; 因为实际上自增不会使用这种方式,而是i++;语句。
现在我把类似的几个需要分辨清楚的,写在了这个小程序中,希望对你有所帮助。
- class Test
- {
- public static void main(String[] args)
- {
- int m = 3 , n ;
- n = m++;//m先把3赋给n,然后自增1,所以语句执行后是m=4;n=3
- System.out.println("m="+m+";n="+n);//输出结果是:m=4;n=3
- //下面再看这个例子
- int i = 3 , j = 3;
- i = i++;//结果是i=3,实质上是与java的编译机制有关。
- j++; // j自增,这句 之后,j=4
- System.out.println("i="+i+";j="+j);//输出结果是:i=3;j=4
- }
- }
复制代码 参考文章的地址: http://wenku.baidu.com/link?url=GE7Mf3cpOxTUW6IlnuQi0h1jkoLv1W-iCNzm1brisTtQ0MUaBJbJ_dxUYzpJqtqvxzGGZM7bqBF2Wt0Aq3Ec32nWoS0yhyjTzMCw_ZCTEpO
或者
http://blog.sina.com.cn/s/blog_e8d9ad7a0101fjca.html
作者: tacyjay在路上 时间: 2014-4-21 07:51
本帖最后由 tacyjay在路上 于 2014-4-21 07:54 编辑
昨晚回答了这个问题后,临睡前还在思考这个问题,我觉得我举得这个例子需要认真思考,才能理解说的是什么,就连我自己当时也不是很确定。
j=i++;这种方式(请注意是j),完全是会按先赋值后自增的方式,但唯独是i=i++;这种方式不是!!!,为了弄清楚,下面我举个更有说服力的例子:
- class Test1
- {
- public static void main(String[] args)
- {
- int i = 3;
- int j=3;
- i = i++;//按照++的原则,似乎是右边的i先把3赋给左边的i,然后再自增1,可事实是这样吗?看下面这个例子。
- j++;//这个是正常写法,j自增1
- System.out.println("i="+ i +";j="+j);//这里,输出:i=3;j=4
- i = i++;//这里,如果真是如在上个步骤中所说,此时的i应该是等于4,然后就接着按上述步骤进行,可事实上呢?
- j++;
- System.out.println("i="+ i +";j="+j);//这里,输出:i=3;j=5 。
- //于是我有个疯狂的想法,用下面这个例子来证明。
- i = i++;
- i = i++;
- i = i++;
- i = i++;
- System.out.println("i="+ i);//猜猜看,这个结果是多少?动手试试吧!
- }
- }
复制代码 结果很意外,有木有!!!!(文章的最后有结果)
对于j=i++;这种情况(注意是j),毫无疑问,是先将i的值赋给j,然后i在此语句结束之后,就自增1。
对于i=i++; 按理说应该也是先把右边的i赋给左边的i,然后在此语句结束之后,i自增1,
可是事实上,无论i=i++;运行多少次,i的值都不变!!
所幸这种情况,仅限于i=i++;这种方式。对于这种情况,记住就好了。
如果你像我一样较真,那就接着看好了。
-----------------------------------------------完整文章贴不完,见附件----------------------------------------
关于java中i=i++的解释下面我将针对上次课程中,关于i++的问题给大家做个补充解释。
在上节课中,在讲到i++和++i的时候,给大家写了个例子:
public class Test {
public static void main(String[] args) {
int i = 10;
int j = 20;
i = i++;
System.out.println(i);
}
}
原本在第5行,我是想写j = i++;来着,但是错写成i=i++;也正是由于这个语句,得出了令人意想不到的结果。因为如果写成 j=i++;
那么会输出j=11;
而写成i = i++;则输出得到i=10;
而如果同样的代码换成C/C++执行,则无论是i=i++还是j = i++; 得到的结果是相同的,都是11,这是为什么呢?
其实就 i = i++;这个语句而言,其实很无聊,谁又会写这样一个语句呢(写错除外^_^),因为当你声明了 i = 0;后,要么你使用0,即直接使用i,要么你使用1,即用i++或者++i;没有必要写i=i++;所有这样的语句很无聊。但是正是这么个无聊的语句,引发了一个关于编译器编译机制的大问题的讨论!为什么java得到j=11,i=10;而C/C++得到的都是11呢?
这是由于Java和C/C++采用的编译器不同,编译器不同,所以编译机制也不同。
-----------------------------------------------本例的结果在下面----------------------------------
作者: 志ぁ才☆博ぁ成 时间: 2014-4-21 08:53
++i和i++的区别是前者先给i加1再赋值给左边,后者是先给左边赋值再给i加1。
作者: xiaochen33520 时间: 2014-4-21 13:31
这个是先赋值在自增加一 所以i=3 不等于4
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |