int a=2 ;int b=a+3*a++
int a=2 ;int b=(a++)+3*a
第一个b=8第二个b=11
结果为什么不一样啊
同样是a++同样是*3结果为什么不一样呢
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
9条回答
- danielinbiti 2015-06-13 14:05关注
哎,怎么还这帖子呀,这实际单纯是编译器谁写的就是什么规则。 从java来说,一个表达式来了,边扫描边取数,符合规则就计算,不是说一看到表达式就去计算运算符的优先级高的部分,它也得从左往后解析过去。 int b=a+3*a++ 就比如上面这句话,表达式是a+3*a++,从左往后扫描,扫描到a,取a的值2,后面是+号,+号运算需要2个数,还需要往下扫描一个数,扫描到是3,但发现3后面是*,优先级高于+号,乘号也是需要2个数,接着取下一个数a(值是2),再往下扫描是++,优先级高于*号。 根据扫描顺序,你可以得到一个独立的指令列表(栈)2,3,2,++,*,+这么一组指令。执行++后,原来的a的值是3(这改的不是栈中的,是a变量的值),所以表达式计算中还是2*3+2 如果上面表达式改成 int b=3*a++ + a的话,那结果就不一样了 从左往右扫描,取常数3,往下扫描是乘号,需要再取一个数,是a,取a的值2,接着扫描下一个,发现是++,优先级高于乘号。接着往下扫描,发现是+号,优先级低于前面。则前面可以先运算了。 前面的指令列表是 3,2,++,*。执行++,原来的a的值是3(这改的不是栈中的,是a变量的值),执行乘,3*2=6,这是后再看是+号,取下一个数,是a,取值,这时候值是3了,已经改变了。所以变成6+3=9. 大概过程是这么一个过程。 各种语言同一行的编译和执行方式都有些差异的,这得看具体的语言,比如C语言就不会出现9。 如果自己还不清楚,建议去看看JVM相关的指令编译和执行过程相关的内容。
另外,把前面的帖子结了吧。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报