首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

m = 一; n = m+++m++; m取内存几次

2013-02-03 
m 1 n m+++m++m取内存几次?看到裘大师文章中有关顺序点的讨论,其中m 1 n m+++m++就是讨论的例

m = 1; n = m+++m++; m取内存几次?
看到裘大师文章中有关顺序点的讨论,其中m = 1; n = m+++m++;  就是讨论的例子,小弟有问题请教
1.这里的n = m+++m++;  是不是无论先做前面还是先做后面的m++,m都只取内存一次,即第二次计算m++是取寄存器里的m值;
2.这里m+++m++有顺序点吗?按裘大师的讲法,n的值不确定,那就表示是有顺序点的,但是这个顺序点在哪里产生的呢?
[解决办法]
不同编译器不同的处理方式
XP VS2005 debug
汇编如下。
m+++m++ 操作了5次内存。
int n = m+++m++;操作了6次内存。

int m = 1;
004A663F  mov         dword ptr [ebp-24h],1 
int n = m+++m++; 
004A6646  mov         eax,dword ptr [ebp-24h] 
004A6649  add         eax,dword ptr [ebp-24h] 
004A664C  mov         dword ptr [ebp-30h],eax 
004A664F  mov         ecx,dword ptr [ebp-24h] 
004A6652  add         ecx,1 
004A6655  mov         dword ptr [ebp-24h],ecx 
004A6658  mov         edx,dword ptr [ebp-24h] 
004A665B  add         edx,1 
004A665E  mov         dword ptr [ebp-24h],edx
 
[解决办法]
引用:
引用:1.为什么第二次只能取寄存器的 有什么根据 第二次依然可以是从内存中读 [并且 需要注意的是 第二次读取数据的时候 第一次求值的结果可能已经写入m 也有可能还没有把结果写入m]

2.m+++m++没有顺序点 这个表达式的前一个顺序点是前一条语句的 ; 下一个顺序点是在n=m+++m++本身的;
计算结果最后m=3,也就是……
计算最后结果是3 这个结论 暴露了你根本没看懂帖子在说些什么 
未定义行为就是结果不可靠 可能是3 可能是4 可能是其他的什么东西 建立在计算结果是3这个错误认识上面是全部结论都是错的 可以作废 

热点排行