当前位置:  技术问答>linux和unix

while( * strDest++ = * strSrc++ )是否可行??为什么??

    来源: 互联网  发布时间:2016-04-05

    本文导语:  char * strcpy( char * strDest, const char * strSrc ) {      char * address;        assert( ( strDest != NULL )  && ( strSrc != NULL ) );      address = strDest;      while( ( * strDest++ = * strSrc++ ) != '' );     ...

char * strcpy( char * strDest, const char * strSrc )



    char * address; 

 

    assert( ( strDest != NULL )  && ( strSrc != NULL ) ); 

    address = strDest; 

    while( ( * strDest++ = * strSrc++ ) != '' );

 

    return address; 

}
/*************************************************************/ 

char * strcpy( char * strDest, const char * strSrc )



    char * address; 

 

    assert( ( strDest != NULL )  && ( strSrc != NULL ) );  

    address = strDest; 

    while(  * strDest++ = * strSrc++ );

 

    return address; 

}



|
A:while( ( * strDest++ = * strSrc++ ) != '' ); 
B:while(  * strDest++ = * strSrc++ );

这两种写发都可行,且效率是一样的!
理由如下:
众所周知,在32位系统中,C语言字符变量占一个字节,字符串在内存中以字符‘’为结束标志,而字符‘’的ASCII值就等于0。
在C语言中的条件判断,当值为0,为假,非0为真。

语句A的意思是:取strSrc中的一字节内容,赋给strDest,再比较*strDest与‘’是否相等,然后strSrc加一,strDest加一。
语句B的意思是:取strSrc中的一字节内容,赋给strDest,再根据*strDest的值,判断条件的真假,如果*strDest等于0为假,否则为真。
然后strSrc加一,strDest加一。

0040103E   mov         ecx,dword ptr [ebp+8]   //取指针strDest
00401041   mov         edx,dword ptr [ebp+0Ch] //取指针strSrc
00401044   mov         al,byte ptr [edx]       //*strSrc暂存至ecx的低16位(al)
00401046   mov         byte ptr [ecx],al       //*strDest = *strSrc
00401048   mov         ecx,dword ptr [ebp+8]   //strDest暂存至ecx
0040104B   movsx       edx,byte ptr [ecx]      //*strDest暂存至edx
0040104E   mov         eax,dword ptr [ebp+8]   //strDest暂存至eax
00401051   add         eax,1                   //strDest++
00401054   mov         dword ptr [ebp+8],eax   //把改变后的strDest放回先前的位置
00401057   mov         ecx,dword ptr [ebp+0Ch] //取指针strSrc
0040105A   add         ecx,1                   //strSrc++
0040105D   mov         dword ptr [ebp+0Ch],ecx //把改变后的strSrc放回先前的位置
00401060   test        edx,edx                 //测试寄存器edx是否为空(edx其实等于*strDest)
00401062   je          MyStrcpy+46h (00401066) //不为0,退出循环
00401064   jmp         MyStrcpy+1Eh (0040103e) //否则跳到0040103e处,继续循环

|
while( ( * strDest++ = * strSrc++ ) != '' ); 
while(  * strDest++ = * strSrc++ ); 

等效,while(0)和while ('' != 0)在C里是一样的。

|
没看出你的while('' != 0)是针对哪一句说的。

我只看到结束时是while('' != '')和while('')


|

楼主问的问题到底是什么?编译器没有漏洞。while(0)和while ('' != 0)在C里是一样的。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux 下c++开发error while loading shared libraries问题解决
  • for(iter.hasNext()){....}用法与while有什么区别?
  • 消息队列一般是怎么使用的,是采用While的方式进行轮询么
  • shell 的 while无限循环问题!
  • shell脚本中while不能嵌套?
  • error while loading shared libraries:libncurses.so.4
  • 请教一个基础问题while循环怎么从10到0来循环10次?
  • 新手请教:while read中末尾的重定向表示什么意思?
  • proc时错误:error while loading shared libraries.....
  • Bash 中的while 语句
  • 关于shell中的while循环的使用,求助
  • shell 脚本 while循环结构问题,急ing,,,,,,
  • shell编程中while的问题,高分
  • error while loading shared libraries:在线等
  • 请问为什么这样的两个while循环却有不同的效果
  • 简单的shell脚本 关于while循环
  • MySQL与MSSQl使用While语句循环生成测试数据的代码
  • cygwin——error while loading shared libraries:?
  • for( ; ; ) 与 while( 1 ) ?
  • while和for可以相互转换的例子分享
  • 小问题---Linux Shell编程之while语句


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3