无意中看到了关于面试题的博客 博客的
为了防止博客的失效我将其代码引入:
void strcpy( char *strDest, char *strSrc ){ while( (*strDest++ = * strSrc++) != '\0’ ); // ........................................2分}
void strcpy( char *strDest, const char *strSrc ) //将源字符串加const,表明其为输入参数,加2分{ while( (*strDest++ = * strSrc++) != '\0’ ); // ........................................4分}
void strcpy(char *strDest, const char *strSrc) { //对源地址和目的地址加非0断言,加3分 assert( (strDest != NULL) && (strSrc != NULL) ); while( (*strDest++ = * strSrc++) != '\0’ ); //............................................7分}
char * strcpy( char *strDest, const char *strSrc ) { assert( (strDest != NULL) && (strSrc != NULL) ); char *address = strDest; while( (*strDest++ = * strSrc++) != '\0’ ); //........10分 (通过查阅资料,我认为这个结果并不是满分) return address;}
看到这道题后,分数的逐步提高,嗯,的确是。 那看了据该分析一下为什么分数有提高,其实原作者已经写出来,我自己做点自己的理解描述:
1. 使用断言方式检验参数,如果传入的参数中 存在NULL,ok。。。。。gameover。。。。。
2. 使用const来约束strSrc,符合程序健壮性原则。凡是是修改试图改动strSrc的内容,编译器将产生错误。
可以参见 楼主其他中关于指针常量的讲解。
3. 为了链式编程 。
4. 通过一个例子 对这个问题进行一下解析
5 我算是笨死了不知道站在巨人的肩膀上
看到这道题后,描述第二个问题 while( (*strDest++ = * strSrc++) != '\0’ );
1. 我们首先确定问题 优先级 , 关于c语言符号优先级 已经有帖子描述 。
2. ok,我们举一个上学时候常见的例子。问题: ;
#define PRODUCT(X) (X*X)int main(void){ int i = 3, j, k; j = PRODUCT(i++); k = PRODUCT(++i); printf("j = %d, k = %d", j, k); return 0;}
答案 j = 9, k = 49; 关于这个有详细的描述
http://www.cnblogs.com/rookie2/archive/2012/11/11/2765112.html;
下边 继续我们的话题:
while( (*strDest++ = * strSrc++) != '\0’ ); 我们现在将它进行逐步分级
1) strDest = *strSrc;
2) *strSrc != 0;
3) *strDest ++;
4)*strSrc ++;