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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

澄海

初级黑马

  • 黑马币:0

  • 帖子:6

  • 精华:0

本帖最后由 澄海 于 2012-8-9 10:41 编辑

int a=11;
if(a++==11){
a=a+a++;
}
system.out.println(a);
为什么结果是24?

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1 i加油!

查看全部评分

8 个回复

倒序浏览
本帖最后由 杨锦 于 2012-8-8 20:02 编辑


发错了,值能空了

回复 使用道具 举报
                int a=11;
                if(a++==11){//(11==11), a=a+1
                System.out.println("a= "+a);//12
                a=a+a++;//12+12
                }
                System.out.println(a);

点评

以后回答把原因等注释好点。嘿嘿  发表于 2012-8-9 10:51
回复 使用道具 举报
这个我超级懂 哈哈

如果令n=8
n++这个表达式的值为8
而在下一一次引用n的值时会得到9

而运算表达式会根据运算优先级计算
但是优先级是一种等待机制
如果碰到优先级高的运算符
前面的计算就会暂停并把结果保留
等待高优先级运算完毕再继续运算

int a=11;
if(a++=11){
a=a+a++;
}
其中a=a+a++
的代数运算顺序是(a++)->(a+(a++))->a=(a+(a++))

计算机从左向右扫描表达式
=后面扫描到a
此时表达式a的值为12,于是用12替换a
a=12+a++
运算符++优先于+因此+等待++运算完毕
表达式a++的值为12
于是用12替换a++此时a的值已经变为13
a=12+12
+运算已经没有障碍,于是用24替换12+12
a=24
最后执行赋值,将内存中a变为24

也就是说a=a+a++
首先计算+左边的a结果12
然后计算+右边的a++结果依旧是12,只不过此时已经将a赋值为13
最后将两个12相加的结果赋值给a自己

换一下顺序的话
a=a++ + a(注意++后的空格)
首先计算+左边的a++结果是12,只不过此时已经将a赋值为13
然后计算+右边的a结果是13
最后12和13相加的结果赋值给a自己
也就变成了梦寐以求的25了

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 很给力!

查看全部评分

回复 使用道具 举报
估计你疑问在于a=a+a++这一句吧,我也初学者,琢磨了一下,个人理解:
运算前由于if判断语句里a自加一次,所以a值为12。
这一句里a自加是在=号右边加法运算完成后、赋值运算之前进行。
a+a                 等号右边运算结果为24                                a值为12                 
a+a++             等号右边运算结果为24                                a自加一次值为13   覆盖掉12                 
a=a+a++         等号右边运算结果为24,并将其赋给a             a值为24  覆盖掉13
所以最后结果是24;
第二次自加是在赋值运算之前进行!
不知道是不是这样。


评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 新人亮相,赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 焦晨光 于 2012-8-8 21:34 编辑

int a=11;
if(a++==11){//执行完这条语句后 a的值为12

a=a+a++;
  
  关键在这条语句 主要分析 a+a++,前面的a被确定为12,后面的a++运算前仍然是12 ,所以
  a+a++(的值为 24)已经被确定下来 ,然后执行a++, a的值为13 ,然后执行赋值语句
  a=a+a++(先前被确定的值为 24)(相当于a在这条语句被赋了两次值 先赋了13 后又赋24也就是最后确定的值)
  完整的执行顺序
  a+a++等于24
  a++等于13
  a=24
  故a=24

}
system.out.println(a);
为什么结果是24?
完整的执行顺序

点评

按你这样说,结果貌似是25呀。进入语句里a++ =12,a=12,所以 a+a++=24.然后,通过赋值语句,赋给a,所以a=24.你觉得呢?  发表于 2012-8-8 23:07
回复 使用道具 举报
int a=11;
if(a++==11){//1.这里,a++表达式的值仍是11,所以符合条件,开始往下执行。
a=a+a++;//2.这儿,到这的时候a的值已加1,所以a的值先是12,a+a++这个表达式可以看做a+(a++)又一个a++,此表达式的值12,
       又开始第3步运算因为左边的a是12,所以结果是24

}
system.out.println(a);
为什么结果是24?

补充:对于a++和++a的区别,a++是先执行后运算而,++a是先运算后执行
所以例如
int a=0;
System.out.println(a++);此时输出0 此时只是输出表达式的值
System.out.println(a++);此时输出1 等到这一步运算的时候,a的值才加1.表达式的值和a的值是不相同,不同时自增的

System.out.println(++a);此时输出3 ,到这一步的时候a的值为2,++a之后,此表示的值为3,a的值也为3.表达式和a的值同时自增
System.out.println(++a);此时输出4 这一步原理同上。


希望,楼主能理解。
回复 使用道具 举报
本帖最后由 焦晨光 于 2012-8-8 23:18 编辑
焦晨光 发表于 2012-8-8 21:31
int a=11;
if(a++==11){//执行完这条语句后 a的值为12


a=a+a++ 前面的a是确定的 12 后面的a在运算前也是确定的12 然后要进行运算吧 12+12=24 这个运算结束后
执行a++ a的值变为13 然后接着进行赋值操作就是前面计算好的那个值24 也就是a在这个元算里被赋了两次值
第一次是a++赋值 13 第二次是a=a+a++ 赋值 等于24 ,a++先于a=a+a++ 赋值 后面的=号赋值把a++的值(13)覆盖了
所以步骤为
1.先运算 a+a++ 值为24
2.然后 a++ a的值被改变 13
3.最后=号赋值a=上面第一步的值 即24

第3步的赋值,把第2步的赋值 覆盖了

回复 使用道具 举报
谢谢各位了 l了解了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马