今天做了一个有趣的测试

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

在电脑跟前浏览网站,突然看到了一篇文章,是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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值