在检查条件之前,在do-while循环中初始化字符串将跳转到该字符串

时间:2018-12-24 19:59:58

标签: c++ string do-while

我遇到了这个问题,条件可能会拒绝该字符串,并且需要再次生成它(它是一个随机字符串)

#include <string>

int main(){
    std::string str;
    do{
        std::string str{""};
        str.append("foo");
    }
    while( str != "foo" );

    return 0;
}

我希望str等于“ foo”,程序将继续执行,但事实并非如此。卡住了。使用gdb进行检查时,我注意到它从str.append("foo");跳回到std::string str{""};,只有 then 继续检查条件,因此该条件将永远无法满足。为什么会这样?

1 个答案:

答案 0 :(得分:2)

循环中您有一个重复的str变量:

std::string str;
do{
    std::string str{""}; // <----- here
    str.append("foo");
}
while( str != "foo" );

这使得while循环正在检查第一个str,因为循环内的str不在范围之内,并且永远不会更改。

while循环中,您正在修改第二个str变量,因为(来自cppreference):

  

实际范围与潜在范围相同,除非存在带有引入相同名称的声明的嵌套块(在这种情况下,嵌套声明的整个潜在范围被排除在外部声明的范围之外)

要解决此问题,只需从代码中删除行std::string str{""};。如果您需要将其重置,请修改str而不是创建一个新的

std::string str;
do{
    str = "";
    str.append("foo");
}
while( str != "foo" );