u010712045 2015-06-13 09:33 采纳率: 61.1%
浏览 1676
已采纳

同样是a++同样是*3结果为什么不一样呢

int a=2 ;int b=a+3*a++
int a=2 ;int b=(a++)+3*a
第一个b=8第二个b=11
结果为什么不一样啊

  • 写回答

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相关的指令编译和执行过程相关的内容。
    

    另外,把前面的帖子结了吧。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

悬赏问题

  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型