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

为何在while循环条件中使用pos = str.find()会输出3和1?

问题根源:C++运算符优先级导致的赋值逻辑错误

这是个很经典的C++运算符优先级坑!咱们一步步拆解看看问题出在哪:

首先先把你的代码贴出来方便分析:

int main() { 
    int pos; 
    string str = "asd\t123"; 
    pos = str.find('\t'); 
    cout << pos <<endl; 
    while (pos = str.find('\t') != string::npos) { 
        cout << pos <<endl; 
        break; 
    } 
    cout << pos <<endl; 
    return 0; 
}

第一步:初始赋值的正确输出

第一行pos = str.find('\t');完全没问题:str.find('\t')找到了制表符在字符串的第3个索引位置(从0开始计数),所以这里输出3,符合预期。

第二步:while循环里的“隐形陷阱”

你原本想写的逻辑应该是:先把str.find('\t')的结果赋值给pos,再判断这个值是不是不等于string::npos——也就是(pos = str.find('\t')) != string::npos。

但C++的运算符优先级规则里,!=的优先级比=更高!所以实际执行顺序完全变了:

  1. 先计算str.find('\t') != string::npos:因为find确实找到了制表符,返回值3不等于表示“未找到”的string::npos,所以这个比较的结果是布尔值true。
  2. 然后把布尔值true赋值给int类型的pos:在C++里,布尔值true会被隐式转换成整数1,所以pos被设置成了1。

接下来进入循环,输出1,然后break跳出循环,最后再输出一次1——这就是你看到输出3和1的原因。

怎么修复?

只需要给赋值表达式加上括号,强制改变运算顺序,让赋值先执行:

while ((pos = str.find('\t')) != string::npos) {
    cout << pos <<endl;
    break;
}

这样就会先把find的结果赋值给pos,再判断pos是否不等于npos,符合你原本的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:52:28