C++ 字符串按值传递

C++ string pass by value

C++ 字符串按值传递在这里让我感到困惑。我期待它打印出来 aa ab ba bb 但是,它打印 aa aab aba abab。为什么会这样?

std::string s, ab = "ab";
test(s, 0, ab);
void test(std::string s, int i, std::string ab){
    if(i == ab.size()){
        cout << s << ' ';
        return;
    }
    for(auto c : ab){
         s += c;
         test(s, i + 1, ab);
    }
}

如果我替换

s += c;
test(s, i + 1, ab);

来自

test(s + c, i + 1, ab);

它将按预期工作。

当您使用 += 时,您会在每次迭代中向 s 添加一个字符,因此您将越来越长的字符串传递给 test 直到 ab 已追加。

如果你展开循环,也许它会变得更明显:

s += ab[0]; // s is now "a"
test(s, i+1, ab);
s += ab[1]; // s is now "ab"
test(s, i+1, ab);
...
s += c;

在每个循环中将 c 附加到本地字符串 s 运行,因此 s 被修改

test(s + c ...)

将c附加到本地字符串s并传递结果字符串,s在每个循环中都相同运行