C++字符串复制函数while循环条件可同时赋值比较的原理疑问
核心原因:C/C++ 赋值表达式的返回值特性
在C/C++语法规则中,赋值操作符=并不只是完成变量赋值的操作,它组成的赋值表达式会返回「赋值完成后左操作数的值」作为整个表达式的运算结果。
我们平时写的链式赋值a = b = 5就是这个特性的典型应用:先执行b = 5,这个表达式返回赋值后的b的值5,再执行a = 5,最终a、b都被赋值为5。
回到你给出的代码,while ((*to = *from) != '\0')的执行逻辑是按以下顺序走的:
- 先执行括号内的赋值操作:把
from指针当前指向的字符,写入to指针指向的内存地址 - 取这个赋值表达式的返回值(也就是刚刚写入的那个字符),和字符串结束符
'\0'做不等于比较- 若写入的不是结束符,比较结果为真,进入循环体,两个指针各后移一位,继续复制下一个字符
- 若写入的刚好是
'\0',比较结果为假,循环终止,同时也完成了字符串结束符的复制,符合C风格字符串的存储要求
你也可以把它展开成更易懂的等价写法,逻辑完全一致:
void copy_string(char* from, char* to) { while (1) { *to = *from; // 先完成赋值 if (*to == '\0') // 再判断是否复制到了结束符 break; to++; from++; } }
另外注意这里的括号是必须的:因为!=运算符优先级高于=,如果不加括号,表达式会被错误解析为*to = (*from != '\0'),把布尔判断结果赋值给*to,完全偏离原本的复制逻辑。
内容的提问来源于stack exchange,提问作者Eric Yan
相关产品推荐
相关产品推荐

