为何在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++的运算符优先级规则里,!=的优先级比=更高!所以实际执行顺序完全变了:
- 先计算
str.find('\t') != string::npos:因为find确实找到了制表符,返回值3不等于表示“未找到”的string::npos,所以这个比较的结果是布尔值true。 - 然后把布尔值
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
相关产品推荐
相关产品推荐

