黑马程序员技术交流社区

标题: 谁帮我解释下这几题的原理 [打印本页]

作者: xiangzi2008006    时间: 2013-9-1 15:13
标题: 谁帮我解释下这几题的原理
本帖最后由 xiangzi2008006 于 2013-9-1 20:29 编辑

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);

作者: 范龙波    时间: 2013-9-1 15:21
本帖最后由 范龙波 于 2013-9-1 16:07 编辑

优先级由高到低:
算术运算符
比较运算符
逻辑运算符:&& ,|| ,!
赋值运算符:= ,+=
(其它运算符: n++ n--  ! 这个比较特殊)
<br>
顺便把刚才做测试的两个小练习给你列出来你看一下\
练习 1
int b = 1;
if(3+4*2>10&& flag=true)  打印结果为true

练习 2
                int b = 5;
                b += b--; // 5+5
                System.out.println(b);
                b = 5;
                b += --b; // 5+4
                System.out.println(b);

                b = 5;
                b += ++b;// 5+6
                System.out.println(b);
                b = 5;
                b += b++; // 5+5
                System.out.println(b);


作者: 武嘉豪    时间: 2013-9-1 15:24
应该是先算count=count+count再算count++
作者: Nero    时间: 2013-9-1 16:41
本帖最后由 Nero 于 2013-9-1 19:11 编辑

大哥
先说的你 1 2 题
1和2不一样吗  如果把count看做a,吧count++看做b,那么
a+b不就等于b+a,,小学一年级不就经常做 1+2=3  和2+1=3  这种题么

再说 你的 3 4 题
用了for循环
只是count的初始值不同罢了
就像..........
5=2+3  5=3+2

7=3+4  7=4+3
只是!!初始值不同而已哦!!....
不知道 这么回答给不给分??........




oh!~~~~    版主   I'm so sorry~~~~~


作者: jing迪    时间: 2013-9-1 16:41
count++中的++是变量先参与运算然后再自加  

你先把变量运算的结果赋值给变量然后再自加嘛
作者: 第一印象    时间: 2013-9-1 17:06
本帖最后由 第一印象 于 2013-9-1 17:15 编辑

第一个问题: 要明白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,所以就出现了这样的结果了


作者: wrswuxiaoyan    时间: 2013-9-1 18:44
只要明白这个原理就好了!count = count + count++的结果就相当于count = count + count




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