简单的“结合”,致命的失误。

在写个简单的数组插入排序,涉及到数组元素赋值。逻辑是元素后移,将前一个元素值赋值给下一个。于是写下了与下面例子相近的代码:

 

char ap[] = "fdpasb";

 

int i = 1;

ap[i] = ap[--i];

 

 

运行后发现赋值没有起到作用,数组未有任何变化。搞了半天没思路,以为是编译器优化的原因,于是硬着头皮看其汇编代码:

 

char ap[] = "fdpasb";

010D1418  mov         eax,dword ptr [string "fdpasb" (10D573Ch)]  

010D141D  mov         dword ptr [ebp-10h],eax  

010D1420  mov         cx,word ptr ds:[10D5740h]  

010D1427  mov         word ptr [ebp-0Ch],cx  

010D142B  mov         dl,byte ptr ds:[10D5742h]  

010D1431  mov         byte ptr [ebp-0Ah],dl  

 

int i = 1;

010D1434  mov         dword ptr [ebp-1Ch],1  

 

ap[i] = ap[--i];

010D143B  mov         eax,dword ptr [ebp-1Ch]  

010D143E  sub         eax,1  

010D1441  mov         dword ptr [ebp-1Ch],eax  

010D1444  mov         ecx,dword ptr [ebp-1Ch]  

010D1447  mov         edx,dword ptr [ebp-1Ch]  

010D144A  mov         al,byte ptr [ebp+edx-10h]  

010D144E  mov         byte ptr [ebp+ecx-10h],al 

 

 

注意加粗黑的几行,赋值表达式两边的元素index是完全一致的自减后的结果.... 这才想到赋值表达式的右结合。

 

 

检讨下失误的原因:逻辑与代码语法脱钩了。。望自勉,少再犯这种很低级的错误。:(

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值