0

按值传递的 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);

它将按预期工作。

4

2 回答 2

2
s += c;

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

test(s + c ...)

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

于 2021-04-08T12:17:27.543 回答
1

当您使用 时+=,您会在每次迭代中添加一个字符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);
...
于 2021-04-08T12:17:26.397 回答