黑马程序员技术交流社区
标题:
一道基础题,但是我没弄明白
[打印本页]
作者:
武嘉豪
时间:
2013-9-3 12:31
标题:
一道基础题,但是我没弄明白
本帖最后由 武嘉豪 于 2013-9-3 14:26 编辑
public static void main(String[] args){
int i=0;
i=i++;
System.out.println(i);
}
复制代码
为什么输出的不是1呢?
我理解的应该是先算i=i,然后再算i++
但是运算结果确实是0
作者:
EYE_SEE_YOU
时间:
2013-9-3 12:44
你说的是对的,但你理解是错的
第一步确实是i=i
第二步是【i】=【i】+1
我之所以用【i】与i区分是因为这两个i是不同的变量
【i】在第二次运算中确实+1了,但它这个值并没有赋给我们的变量i
而我们要的变量i却在第一步受到赋值,i=【i】
作者:
CHJ
时间:
2013-9-3 12:56
1、++i 的用法(以 a=++i ,i=2 为例)
先将 i 值加 1 (也就是 i=i+1 ),然后赋给变量 a (也就是 a=i ),
则最终 a 值等于 3 , i 值等于 3 。
所以 a=++i 相当于 i=i+1 ,a=i
2、i++ 的用法(以 a=i++ ,i=2 为例)
先将 i 值赋给变量 a (也就是 a=i ),然后 i 值加 1 (也就是 i=i+1 ),
则最终 a 值等于 2 ,i 值等于 3 。
所以 a=i++ 相当于 a=i , i=i+1
3、++i 与 i++
a=++i 相当于 i++ , a=i
a=i++ 相当于 a=i , i++
4、++i 与 i++ 单独使用时,相当于 i=i+1
如果赋给一个新变量,则 ++i 先将 i 值加 1 ,而 i++ 先将 i 赋给新变量。
作者:
第一印象
时间:
2013-9-3 13:41
前几天有个哥们儿在论坛里问到过类似的问题了,这里我把它的题目与我的回答摘过来,相信你看完后,会对这一类的问题有所明白的,以下是这四道题以及对这四道题的详细讲解:
1.
int count = 0;
count = count + count++;
System.out.println(count);
2.
int count = 0;
count = count++ + count;
System.out.println(count);
3.
int count = 0;
for (int i = 0; i < 100; i++) {
count = count + count++;
}
System.out.println(count);
4.
int count = 1;
for (int i = 0; i < 100; i++) {
count = count + count++;
}
System.out.println(count);
复制代码
第一个问题: 要明白count = count + count++的结果,首先要知道两个问题:
第一个是这个运算的运算顺序,第二个是count++操作做了什么事,对于运算顺序,肯定是先运算等式右边的
再赋值给左边的变量,右边的运算是从左到右算的,明白了这两个问题再来看题就不复杂了. count = count +
count++;先运算右边,右边从左到右算, 我们要是知道count++的结果就知道了右边的结果了,
count在跟左边的count运算之前,会先进行一个复制,将原来的值复制一份,然后它本身的原值会自增,
需要注意的是原值的自增跟复制后的数据是没有关系的,自增后,原值变成1了, 这时候进行count +
count++进行运算,但是count++参与运算的是复制出来的那份值而不是自增后的结果,
由于等式右边的左边的count是在count++运算前就有值的,所以它是0,而count++的结果是0,所以 就是 0 + 0,
然后将结果赋给了等式左边的count,结果打印就是0
第二个问题: 原理其实跟第一个问题差不多,但结果肯定是不一样的,因为等式右边的运算是要从左到右的,count++ + count,
count先复制一份数据也就是0出来,然后进行自增这时候原值变为1了,而count++参与运算用的是复制出来的0参与
运算的,所以count++ + count实际上就是 0 + 1,为什么这里是0+1而不是0+0呢,因为count++运算虽然用的是复制出来
的那份数据,但是它本身的值已经自增到了1,而count++右边的那个count拿的是自增后的原值也就是1, 所以这个打印结果是1
第三个问题: 如果你第一第二个问题已经看懂了,我相信第三个问题已经不言自明了,count = count + count++;打印的结果
其实就相当于count = count + count;虽然两者底层运算有点差异,但结果是一样的, 所以这个for循环不管有多少次
结果都是0 = 0 + 0,结果都打印为0
第四个问题: 原理也是一样的因为count = count + count++的结果就相当于count = count + count;
所以再来看第四个问题的结果就不为怪了,但是第四个问题有些人可能会感到奇怪,因为结果是0,如果我们自己算也会感到奇怪,
count首先等于1,for循环第一次1 = 1 + 1++结果为2(不解释了吧),再运算的数据会越来越大为什么会为0呢?
我也感到纳闷,但我知道一旦这个count有一次结构为0,后面的所有for循环计算出的结果都为0了,
所以我们找到为0的时候for循环中的i等于多少,
经测算i为31的时候,结果为0,而i为30的时候count等于-2147483648,二进制为
10000000000000000000000000000000,这时候count + count++, 就相当于count *2
了(两个相同的数据相加相当于乘以2, 这个不用解释吧),乘以2就相当于左移1位,结果为0,所以就出现了这样的结果了
复制代码
作者:
影响力147753321
时间:
2013-9-3 14:08
应该是0;
.自增后的i是为1,
但是你i=i++
。这时会把原来没自增前的值0赋给i,此时i存的就是0;你要想得到其自增后的值,就不要赋给i,在重新申明一个变量并赋值给它就可以了
如下代码就可以
public static void main(String[] args){
int i=0;int b;
b=i++;
System.out.println(i);System.out.println(b);
}
作者:
武嘉豪
时间:
2013-9-3 14:26
谢谢楼上各位,已经想通咯~
作者:
EYE_SEE_YOU
时间:
2013-9-3 17:27
武嘉豪 发表于 2013-9-3 14:26
谢谢楼上各位,已经想通咯~
我知道,其实楼主很强大的,大牛
作者:
夏菲
时间:
2013-9-3 19:09
估计是你看到后面了把前面的知识点给忘了吧! 毕老师不是教了口诀吗?1分钟就记得住了 主要看右边
i=i++ 指的是先出去玩 后吃饭 等于号你就想象成你们家大门 离门近当然是先出去玩 后玩好了回家吃饭 所以直接就出门了 右边的i没有变化就直接给了左边啊
i=++i 而这个呢 i离门比较远 肯定吃吃了饭再出去玩 你想想 吃完了饭 肯定是 出门前就有东西变化了呗 右边的i就变化后再给了左边啊
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2