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

C++字符串复制函数while循环条件可同时赋值比较的原理疑问

核心原因:C/C++ 赋值表达式的返回值特性

在C/C++语法规则中,赋值操作符=并不只是完成变量赋值的操作,它组成的赋值表达式会返回「赋值完成后左操作数的值」作为整个表达式的运算结果。
我们平时写的链式赋值a = b = 5就是这个特性的典型应用:先执行b = 5,这个表达式返回赋值后的b的值5,再执行a = 5,最终a、b都被赋值为5。

回到你给出的代码,while ((*to = *from) != '\0')的执行逻辑是按以下顺序走的:

  1. 先执行括号内的赋值操作:把from指针当前指向的字符,写入to指针指向的内存地址
  2. 取这个赋值表达式的返回值(也就是刚刚写入的那个字符),和字符串结束符'\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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:06:00