【问题标题】:Declaring variable as i vs &i in the foreach loop在 foreach 循环中将变量声明为 i vs &i
【发布时间】:2021-03-16 13:18:34
【问题描述】:

为什么这些循环给出相同的输出:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> ar = {2, 3 ,4};
    for(auto i: ar) //this line changes in the next loop
        cout<<i<<" ";

    cout<<"\n";

    for(auto &i: ar) //i changed to &i
        cout<<i<<" ";
}

它们都给出相同的输出:

2 3 4

2 3 4

在声明 foreach 循环变量时,不应添加 & 使变量获取数组中值的引用,并打印 i 使其打印引用。这里发生了什么?

通过打印引用我的意思是这样的代码打印:

for(auto i: ar)
    cout<<&i<<" ";

输出:

0x61fdbc 0x61fdbc 0x61fdb

【问题讨论】:

  • 你认为“打印参考文献”应该打印什么?
  • 现在在这两种情况下测试std::cout &lt;&lt; &amp;i &lt;&lt; " ";
  • 引用不是指针,它们是别名。通过打印引用,您可以打印被引用的实际值
  • @Jarod42,我做到了。现在它们都打印以 0x 开头的值...你能解释一下发生了什么吗?
  • @IWonderWhatThisAPIDoes 你能解释一下别名是什么意思吗?也许将我引导到一个资源,在那里我可以了解更多关于此的信息..

标签: c++ loops for-loop foreach ampersand


【解决方案1】:

结果是相同的,因为在第一个循环中,您将变量的值复制到一个新变量i 中并打印它的值。 (分配的额外 RAM)

在第二个循环中,您通过将当前元素的地址分配给i 来访问内存中当前元素的值。 (未分配额外的 RAM)

另一边:

cout<<&i<<" ";

导致打印i的地址。

【讨论】:

  • 嗨 Lyuboslav - 这是我一直在寻找的答案。谢谢。
  • 关于 RAM 使用情况:这可能有点夸大了:godbolt.org/z/Y3xTh6
【解决方案2】:

& 运算符有很多用途。这两个很难识别,即声明中变量前面的&amp;(例如int&amp; i(或int &amp;i,相同的东西)),以及不在变量前面的&amp;声明,例如cout &lt;&lt; &amp;i

试试这些,你会得到更好的理解。

for (auto i : ar)
    cout << i << " "; // 2 3 4 // element of ar
    
for (auto &i : ar)
    cout << i << " "; // 2 3 4 // element of ar

for (auto i : ar)
    cout << &i << " "; // address of local variable i (probably same address)
    
for (auto &i: ar)
    cout << &i << " "; // address of elements of ar (increasing addresses)

【讨论】:

  • 感谢您的回答。这澄清了一些事情。一个问题:代码中的前两个循环有什么区别?添加&符号有什么变化?
  • @Neon,在第一个示例中,i 是 ar 中的值的副本,而在第二个示例中,i 是对 ar 中的值的引用。
猜你喜欢
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 2015-06-02
  • 1970-01-01
  • 2011-05-21
相关资源
最近更新 更多