黑马程序员技术交流社区

标题: 运行结果和想象的不一样 [打印本页]

作者: 赵国刚    时间: 2013-8-13 12:35
标题: 运行结果和想象的不一样
本帖最后由 赵国刚 于 2013-8-14 19:47 编辑

private static void demo2() {

                int a = 2;

                int b = a++ + 3 * a;

                System.out.println(b);// b=8

        }

        private static void demo1() {

                int a = 2;

                int b = a + 3 * a++;

                System.out.println(b);// b=13

        }

}
今天复习发现的疑惑
我认为的是b = a + 3 * a++; b应该是9首先3 * a++为3*2为6,a再自加的到a=3,再加上前面的a到结果为9.
但是运行结果为8.求详细解释?

作者: 曾文德    时间: 2013-8-13 12:39
先赋值给了B然后才++的。
作者: べPNヤ    时间: 2013-8-13 13:42
第一个 运算 顺序  b=2 + 3*3    因为 A++之后 a的值已经是 3了  但是 a++ 是等于2的 所以 B=11  第二个  运算 顺序 为  b=2+3*2  JAVA从左开始计算 所以b=8
作者: 赵国刚    时间: 2013-8-13 13:49
べPNヤ 发表于 2013-8-13 13:42
第一个 运算 顺序  b=2 + 3*3    因为 A++之后 a的值已经是 3了  但是 a++ 是等于2的 所以 B=11  第二个   ...

那下面的13是怎么得的了

作者: masterV    时间: 2013-8-13 13:49
demo1()运行结果为8跟我想的一样。因为a++是先赋值后运算的,所以b = 3*2 +2;然后a再自增1,第二个运行结果是b=11,不是13,但是我没有理解是怎么运算的,求大神解释。
作者: 赵国刚    时间: 2013-8-13 13:50
赵国刚 发表于 2013-8-13 13:49
那下面的13是怎么得的了

呃,你比我还有点混乱了
作者: べPNヤ    时间: 2013-8-13 14:12
本帖最后由 べPNヤ 于 2013-8-13 14:16 编辑

第二个b=a+3*a++        b=2+3*2   结果不用我说了吧   从左往右计算 不是先算的 乘法  a的值开始时2  a++之后  a=3  但是 a++ =2
作者: 会飞的狼    时间: 2013-8-13 14:18
b = a + 3 * a++;这个结果是8,“a + 3 * a++”这个我们成为表达式,表达式的运行顺序是自左向右,第一个a等于2,第二个a也等于2,第二个a算完后就变成3,并不影响第一个a的值,所以结果是8;

a++ + 3 * a:同理这个也是自左向右的,但是第一个a取了2之后立马变成了3,所以后面一个a等于3,所以结果是11。不知道你的13怎么来的
作者: べPNヤ    时间: 2013-8-13 14:19
本帖最后由 べPNヤ 于 2013-8-13 14:20 编辑
赵国刚 发表于 2013-8-13 13:49
那下面的13是怎么得的了

怎么可能运行结果是13  你重新编译 在运行看看 第二个结果是 8  第一个的结果是 11  
作者: 赵国刚    时间: 2013-8-13 14:24
べPNヤ 发表于 2013-8-13 14:19
怎么可能运行结果是13  你重新编译 在运行看看 第二个结果是 8  第一个的结果是 11   ...

哦对啊,我应该是当时打错了
作者: EYE_SEE_YOU    时间: 2013-8-13 14:25
本帖最后由 EYE_SEE_YOU 于 2013-8-13 14:26 编辑

请把全部代码发出来好吗,
单纯:int a = 2;


int b = a++ + 3 * a;

System.out.println(b);     // =》b=2+3*3
这里b=11
单纯:
int a = 2;

int b = a + 3 * a++;        // =》b=2+3*2

System.out.println(b);
这里b=8


作者: 以防万一    时间: 2013-8-13 22:29
亲,如问题已解决请将分类的未解决改为已解决。

以后的问题贴也要及时更改分类哦~


保持队形,谢谢合作
作者: 清心玉质    时间: 2013-8-14 14:55


private static void demo2() {
        int a = 2;
        int b = a++ + 3 * a;、、-->2+3*3  a++运算后+1,所以是3*3
        System.out.println(b);// b=11
}
private static void demo1() {
        int a = 2;
        int b = a + 3 * a++;-->2+3*2  a++运算后才+1,所以此处仍为2
        System.out.println(b);// b=8
}

作者: 赵国刚    时间: 2013-8-14 18:51
杨璐敏 发表于 2013-8-13 22:29
亲,如问题已解决请将分类的未解决改为已解决。

以后的问题贴也要及时更改分类哦~

呃,这个怎么改了,我一直没找到了
作者: 王靖远    时间: 2013-8-14 19:09
demo2中。a++是先赋值后自增。所以这个a的值还是2, 3*a中的自增过的,所以结果为2+3*3=11
demo1中就是2+3*2=8.理解demo2自然就理解demo1
作者: 赵国刚    时间: 2013-8-14 19:52
赵国刚 发表于 2013-8-14 18:51
呃,这个怎么改了,我一直没找到了

http://bbs.itheima.com/forum.php ... mp;extra=#pid447759
http://bbs.itheima.com/forum.php ... mp;page=1#pid447864
http://bbs.itheima.com/forum.php ... mp;page=1#pid446611
帮个忙把




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