for 循环中的 C++ 参考

C++ reference in for loop

如下面代码的for循环中,为什​​么要用引用(&c)来改变c的值。为什么我们不能在 for 循环中使用 c。 可能是argument和parameter的区别?

#include "stdafx.h"
#include<iostream>
#include<string>

using std::string;
using std::cout;
using std::cin;
using std::endl;
int main()
{
    string s1("Hello");
        for (auto &c : s1)
            c = toupper(c);
            cout << s1 << endl;
    return 0;
}

您不能只使用 c,因为那样会复制每个角色的副本,更新副本,然后将其丢弃。引用(或指针)是 C++ 用来传播对象变化的结构。

如果是:

for (auto cCpy : s1)

cCpy 是当前位置字符的副本

如果是:

for (auto &cRef : s1)

cRef 是对当前位置字符的引用

与参数和参量无关。它们连接到函数调用(您可以在这里阅读:"Parameter" vs "Argument")。

如果不使用引用,那么代码在逻辑上看起来像

for ( size_t i = 0; i < s1.size(); i++ )
{
    char c = s1[i];
    c = toupper( c );
}

即每次在循环中都会有更改的对象 c 获取 s1[i] 的副本。 s1[i] 本身不会改变。 但是如果你会写

for ( size_t i = 0; i < s1.size(); i++ )
{
    char &c = s1[i];
    c = toupper( c );
}

那么在这种情况下,因为 c 是对 s1[i] 的引用 when 语句

    c = toupper( c );

改变 s1[i] 本身。

同样适用于基于for语句的范围