虽然很忙,居然很懒,不想做事。
在电脑跟前浏览网站,突然看到了一篇文章,是Joel Spolsky(周思博)写给毕业生的,里面有这么一段:
“无论你知道多少高级的控制结构,知道如何进行错误处理,如果你不能解释为什么while (*s++ = *t++);的意思是进行字符串拷贝(而且对你而言这是世界上最自然,最易懂的代码),那么你就是在对编程一窍不通的状态下编程(programming based on superstition)。”
晕啊,我就不懂啊。
赶快去试试。先用的VC6,代码如下:(哈哈,真少)
#include "stdafx.h"
int main(int argc, char* argv[])
{
char *s = "abc";
char *t = "123";
char * p1=s;
char *p2=t;
while(*t++ = *s++);
printf("s is %s/n",p1);
printf("t is %s/n",p2);
return 0;
}
编译,运行,什么都没有,还报错了。
嗯,看看汇编语句是什么样子的
while(*t++ = *s++);
0040B7FF 8B 55 F 8 mov edx,dword ptr [ebp-8]
0040B802 8B 45 FC mov eax,dword ptr [ebp-4]
0040B805 8A 08 mov cl,byte ptr [eax]
0040B807 88 0A mov byte ptr [edx],cl
0040B809 8B 55 F 8 mov edx,dword ptr [ebp-8]
0040B 80C 0F BE 02 movsx eax,byte ptr [edx]
0040B 80F 8B 4D F8 mov ecx,dword ptr [ebp-8]
0040B812 83 C 1 01 add ecx,1
0040B815 89 4D F8 mov dword ptr [ebp-8],ecx
0040B818 8B 55 FC mov edx,dword ptr [ebp-4]
0040B81B 83 C 2 01 add edx,1
0040B81E 89 55 FC mov dword ptr [ebp-4],edx
0040B821 85 C 0 test eax,eax
0040B823 74 02 je main+67h (0040b827)
0040B825 EB D8 jmp main+3Fh (0040b7ff)
调试显示,是在第四行0040B807 88 0A mov byte ptr [edx],cl
出错了,啊,好乱啊。
改用BCB6试试吧,代码原封不动拷过去。
通过了,结果显示,确实是在拷贝字符串
看看汇编代码
mov ecx,[ebp-0x04]
inc dword ptr [ebp-0x04]
mov al,[ecx]
mov edx ,[ebp-0x08]
inc dword ptr [ebp-0x08]
mov [edx],al
test al,al
jnz -0x14
结论:
嗯,原来跳出循环的条件就是*s的值,字符串以0结尾,在没到s的末尾之前,就一直在向t中拷贝字符,哈哈,明白了(不过写这样的程序会不会被老板开除啊?)。
看到BCB编译的简洁而易懂,语句也少很多。
而VC编译的可真够拖沓的,而且难懂(也许我不懂优化?也许吧)。
最后想想BCB输给了VC,从这个小例子上,真让人感到遗憾。ZZ