k=(++i)+(++i)+(++i);如果i等于3。

#include<stdio.h>
int main()
{int i=3,k;
k=(++i)+(++i)+(++i);
printf("%d",k);
return 0;
}
为什么等于16那,不应该是4+5+6等于15嘛
全部评论
这个问题属于“未定义行为”一类的问题,因为它取决于编译器的实现方式。 在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。 总结一下的话就是,先在同一个内存自增两次并相加,并将结果存放到新的地方,然后继续对原内存自增,再相加;自增,再相加。。。
2 回复
分享
发布于 2015-08-20 13:40
好高深,谢谢
点赞 回复
分享
发布于 2015-08-21 14:58
滴滴
校招火热招聘中
官网直投

相关推荐

1 9 评论
分享
牛客网
牛客企业服务