You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于使用while循环复制字符数组的C代码运行原理问询

解析这段C代码中while循环的工作机制

首先先把你贴的代码完整放出来,方便咱们对照分析:

#include <stdio.h> 
void main() { 
    char a[15] = "hello"; 
    char b[15] = "goodbye"; 
    char * aa = a, *bb = b; 
    while ( (*bb++ = *aa++) ); 
    printf("%s,%s\n",a,b); 
}

我明白你一开始对这个while循环的逻辑有点懵,甚至搞反了复制方向,咱们一步步拆解这个循环到底在做什么:

先看初始状态

  • 数组a里存的是字符串"hello",C语言里字符串末尾会自动加一个终止符'\0',所以a的实际内容是h e l l o \0(后面还有空的内存位置,因为数组大小是15)
  • 数组b初始是"goodbye",实际内容是g o o d b y e \0
  • 指针aa一开始指向数组a的第一个元素(也就是'h'的地址),指针bb指向数组b的第一个元素('g'的地址)

核心:while循环的执行逻辑

这个while ( (*bb++ = *aa++) );看起来有点紧凑,咱们把它拆成几个步骤来看每次循环的操作:

  1. 取值赋值:先把aa当前指向的字符(第一次是'h')赋值给bb当前指向的位置(第一次是b[0])
  2. 指针自增:赋值完成后,aa和bb各自向后移动一个位置(++操作),指向数组的下一个元素
  3. 循环判断:C语言里,赋值表达式的结果就是被赋的值。当咱们把a末尾的'\0'赋值给b对应的位置时,这个值是0,在条件判断里0代表“假”,循环就会终止。

简单说,这个循环就是把数组a里的所有字符(包括终止符'\0')逐个复制到数组b里,直到复制到'\0'的时候停下来。

最终运行结果

循环结束后:

  • 数组a的内容没有被修改,还是"hello"
  • 数组b原来的内容被覆盖成了"hello"(因为从第一个位置开始被a的字符逐个替换,直到'\0')
    所以最后printf会输出:hello,hello

你之前误以为是把b的地址复制到a,其实刚好相反——是把a的字符串内容复制到b里,这个循环其实是C语言里实现字符串复制的一种经典写法(和标准库的strcpy函数逻辑基本一致)。

内容的提问来源于stack exchange,提问作者Aaron Fitzpatrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:13:49