这个问题属于“未定义行为”一类的问题,因为它取决于编译器的实现方式。 在vs下测试得到结果为18,k=(++i)+(++i)+(++i)的汇编实现是这样的: i 的值先被拿到寄存器中,然后加一,再将这个值返回给 i; i 的值再被拿到寄存器中,再加一。。这样来三次,i现在变成了6; 最后再把 i 放入寄存器,再加 i,加 i,得到18返回给变量 k。 总结来说就是在同一个内存多次自增,然后一起相加。 /**********************************分割线*************************************/ 在gcc下测试得到16的结果,汇编语句是酱紫的: i 在这里被拿入寄存器(esp),连做两次自增, 得到值 5,被放入新的寄存器(eax), (注意gcc的 mov 和 vs 相反,gcc 的AT&A语法是 mov 源,目的;vs 的 INTEL 语法为 mov 目的,源) 然后先执行了第一个(i+i)的运算,5+5=10存入edx中; 继续从寄存器 eax 中取 i 值自增,再执行第二个加法运算,最后得到10+6=16。 总结一下的话就是,先在同一个内存自增两次并相加,并将结果存放到新的地方,然后继续对原内存自增,再相加;自增,再相加。。。

相关推荐

牛客热帖

牛客网
牛客企业服务