0 点赞 评论 收藏
分享
2015-08-20 10:23
哈尔滨华德学院 Python CloudCastl...:这个问题属于“未定义行为”一类的问题,因为它取决于编译器的实现方式。
在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。
总结一下的话就是,先在同一个内存自增两次并相加,并将结果存放到新的地方,然后继续对原内存自增,再相加;自增,再相加。。。
查看图片
查看图片0 点赞 评论 收藏
分享
0 点赞 评论 收藏
分享
2015-08-19 15:46
哈尔滨华德学院 Python 薛定谔的猫:指针a指向的区域没有分配内存,memset(a,0,sizeof(a))这一句只是前4个字节初始化为0
0 点赞 评论 收藏
分享
2015-08-18 15:53
哈尔滨华德学院 Python 0 点赞 评论 收藏
分享
创作者周榜
更多
关注他的用户也关注了: