关于使用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++) );看起来有点紧凑,咱们把它拆成几个步骤来看每次循环的操作:
- 取值赋值:先把
aa当前指向的字符(第一次是'h')赋值给bb当前指向的位置(第一次是b[0]) - 指针自增:赋值完成后,
aa和bb各自向后移动一个位置(++操作),指向数组的下一个元素 - 循环判断: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
相关产品推荐
相关产品推荐

