在写个简单的数组插入排序,涉及到数组元素赋值。逻辑是元素后移,将前一个元素值赋值给下一个。于是写下了与下面例子相近的代码:
“
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是完全一致的自减后的结果.... 这才想到赋值表达式的右结合。
检讨下失误的原因:逻辑与代码语法脱钩了。。望自勉,少再犯这种很低级的错误。:(