即使条件为真,While循环也不会重​​复循环

时间:2018-04-17 09:16:09

标签: c++ string do-while size-t

 size_t pos = 0;
 int n;
 char c;

 string temp("x^3+4*x^)8");

 do
 {
      pos = temp.find('^',pos);

      /*code*/

      pos++;

  }while(pos <= temp.npos +1);
  //if temp.find didn't find '^' it will return npos (2^32)

它应该做的是在^中找到temp并将其位置返回到pos,执行代码并增加pos,重复循环,如果条件是真的。如果pos <= temp.npos+1条件为真,即如果temp.find()在字符串中找不到任何^,它将从循环中断开。

但是当我调试时,即使条件为真,调试器也会在退出之前执行一次do循环。

EDIT1 enter image description here

我所知道的是npos = -1,但在我的代码中,当我调试它时,它会给我一些其他内容。

3 个答案:

答案 0 :(得分:3)

npos + 1可能溢出(因为我认为它应该类似于MAX_UINT)然后它(当然)比任何东西都要小。

答案 1 :(得分:2)

npos定义为size_t npos = -1;

npos + 1导致溢出,而​​不是2 ^ 64,它将为零。

如果您想这样做,我建议您检查pos < temp.length()

修正: 另外,您应该在找到后立即检查pos = temp.npos并从周期中调用break以防止在找不到任何内容时处理位置。

答案 2 :(得分:1)

npos是最大的无符号整数。 npos + 1为零且pos >= 0。如果temp.find()返回索引0,则循环将重复。

您可以将循环更改为

do {
    pos = temp.find('^',pos);

    /*code*/

    pos++;
} while(pos != temp.npos);

因为pos > temp.npos永远不可能。