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

相关推荐

07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司8个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-03 18:22
投了几百份简历,专业和方向完全对口,都已读不回。尝试改了一下学校,果然有奇效。
steelhead:这不是很正常嘛,BOSS好的是即便是你学院本可能都会和聊几句,牛客上学院本机会很少了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 13:05
点赞 评论 收藏
分享
评论
1
9
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务