A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 任江峰 中级黑马   /  2013-4-30 10:27  /  1330 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 任江峰 于 2013-4-30 11:32 编辑

int a=4;
System.out.println((--a )<<a);
System.out.println((a--)<<a);
这两句的运行结果是:24,12
请问是运算过程是怎样的?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

6 个回复

倒序浏览
这上面两句其实也就是下面这两句
System.out.println(3<<3);//(因为--a,所以a先减1,再参加运算)
System.out.println(3<<2);//因为a--,所以(a--)直接参加运算,再减去1,再参加移位运算)

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报

int a=4;
System.out.println((--a )<<a);  // 3 << 3, 即3*2的3次方 = 24,并且a=3了
System.out.println((a--)<<a);   // 3 << 2, 即3*2的2次方 = 12,并且a=2了

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报

第一句是a先自减变成3,这样a变成了3,也就是3向左移3位也就是相当于3乘以2的3次方就是3*8等于24
第二句就是a=3直接参加运算后变成2,它自己没变,所以就是相当于3*2的2次方,即等于3*4等于12

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
首先,运算符的优先级从高到低是:“()” > “--后缀自减” > “--前缀自减” > “<<”
然后第一个表达式:(--a )<<a 先求出()内的结果,为:3。这时a的值等于3了,所以执行<<3左移三位的运算
最后第二个表达式:((a--)<<a)因为()运算符的优先级大于 --前缀自减,所以先在栈内存中找一个临时的变量将a的值保存起来,然后让a自减1,这时a=2;再将栈内存中临时保存的值取出来付给位运算符左边,其实最后就是3<<2=12

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
谢谢所有楼上的同学,理解了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马