今天做了一个有趣的测试

虽然很忙,居然很懒,不想做事。

在电脑跟前浏览网站,突然看到了一篇文章,是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 F8             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 F8             mov         edx,dword ptr [ebp-8]

0040B80C0F BE 02             movsx       eax,byte ptr [edx]

0040B80F 8B 4D F8             mov         ecx,dword ptr [ebp-8]

0040B812 83 C1 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 C2 01             add         edx,1

0040B81E 89 55 FC             mov         dword ptr [ebp-4],edx

0040B821 85 C0                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

 

阅读更多
个人分类: 我的程序设计
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭