代码之家  ›  专栏  ›  技术社区  ›  msc

混淆C中的while(*s1++=*s2++);”

  •  1
  • msc  · 技术社区  · 6 年前

    代码:

    #include <stdio.h>
    
    int main()
    {
        char str1[]="bombay";
        char str2[]="pune";
    
        char *s1 = str1;
        char *s2 = str2;
    
        while(*s1++ = *s2++);
        printf("%s\n",str1);
    }
    

    输出:(GCC编译器)

    pune
    

    但根据我的说法 puneay pune 应复制以代替 bomb

    那么,为什么编译器会给出此代码的输出 “普纳” “微不足道” ?

    5 回复  |  直到 6 年前
        1
  •  12
  •   unalignedmemoryaccess    6 年前

    字符串末尾有一个空终止符,该终止符也被复制。

    复制空终止符时,while停止执行,并打印结果。

    所以记忆在 str1 实际包含: 'p' 'u' 'n' 'e' '\0' 'y' '\0'

        2
  •  1
  •   payne    6 年前

    while()语句后面有一个分号,因此它相当于:

    while(*s1++ = *s2++) {
        /* Empty loop */
    }
    printf("%s\n",str1);
    

    所以你只是把s2复制到s1,然后打印。复制操作 包括

    请注意,在 while 之前 while()语句被终止。如果您期望的是“puneay”,请尝试此循环,它在赋值之前测试零终止:

    while(*s1)
       *s1++ = *s2++;
    
        3
  •  1
  •   Lundin    6 年前

    不幸的是,当有人想用指针算法复制C中的字符串时,这种草率的代码相当常见。代码100%等同于:

    *s1 = *s2;
    while(*s1 != '\0')
    {
      s1++;
      s2++;
      *s1 = *s2;
    }
    

    目的是给一个“穷人” strcpy ". 空终止符总是被复制到目标缓冲区中,这就是为什么您得到所描述的输出。

        4
  •  0
  •   0___________    6 年前

    while(*s++ = *s1++) 还复制字符串结束符“\0”,因为在实际逻辑检查之前执行赋值操作。

        5
  •  0
  •   Fábio Morais    6 年前

    while(*s2)
        *s1++ = *s2++ ;
    
    printf("%s\n",str1);
    

    因为(*s2)在字符串末尾有“\0”