当前位置: 首页 > 知识库问答 >
问题:

两个代码之间的区别是什么:for(自动x:v)和for(自动

陶博赡
2023-03-14

我无法理解这两个代码之间的区别,因为它们给了我相同的输出?

void print() {
  int v[] = {0,1,2,3,4,5};
  for(auto x : v)
    cout << x << endl;
}

void increment() {
  int v[] = {0,1,2,3,4,5};
  for(auto& x : v) {
    cout << x << endl;
    ++x;
  }
}

共有3个答案

颛孙钱青
2023-03-14

这两个代码将提供相同的输出。但是在for循环的最后,array v的值是不同的。

在第一个数组中,x只是数组中项目的另一个副本。如果再次打印数组v的值,则它将是相同的。

在第二个数组中,x是数组中给定项的引用。此代码正在打印该值,然后将其增加1。如果再次打印数组v的值,则数组中的所有元素都会增加1。

尝试以下代码:

int v[] = {0,1,2,3,4,5};
cout << "Before :";
for(auto& x : v) {
    cout << x << ", ";
    ++x;
}
cout << endl << "After: ";
for (auto x: v) {
    cout << x << ", ";
}

您将获得以下输出:

Before: 0, 1, 2, 3, 4, 5,                                                                                                                                     
After: 1, 2, 3, 4, 5, 6,  

基本上,您的两个代码在for循环末尾的数组v具有不同的值。

阳昊
2023-03-14

在第一个片段中,x是数组元素的副本,在第二个片段中它是一个引用。第二个片段确实增加了数组中的每个元素,但您没有观察到这一点。

写循环最自然的方法是

for (auto&& x : v) {

查看在基于范围的for循环中使用转发引用的优势是什么?以获取解释。

从很多方面来说,很遗憾速记

for (x : v) {

(这意味着自动

南宫阳冰
2023-03-14

第一个代码片段将显示数组中的每个元素,而不带任何引用(即,它们修改后的值不会应用于原始数组中,因为这只是一个副本)。

另一方面,另一个片段表示它将首先输出元素,然后元素的值将增加一,并且v将被更改。

 类似资料:
  • 我知道什么是“代号”...在循环中(它迭代键),但我听说过(它迭代值)。 我对循环。 我知道迭代属性值。那么为什么它不记录而不记录? 与用于...的循环中,该循环迭代每个键()并迭代键,不迭代属性的值,即。为什么会这样? 在这里,我控制台的循环。它应该记录,但它记录。为什么? 示例链接

  • 问题内容: 我知道什么是循环(对键进行迭代),但是第一次听说(对值进行迭代)。 我对循环感到困惑。我没有形容词。这是下面的代码: 我得到的是,遍历属性值。那么,为什么它不记录(返回)而不是?但是循环遍历每个键()。在这里,循环还会遍历键。但是不会迭代财产的价值,即。为什么会这样呢? 总而言之: 在这里,我控制台循环。它应该记录,但是在这里记录。为什么呢 问题答案: 遍历对象的可枚举属性名称。 (E

  • 问题内容: 我认为标题总结了这一点。我只是想知道为什么对于从Svn进行Java项目的持续集成构建而言,一个或另一个更好。 问题答案: 作为CruiseControl的长期提交者 以及 从未使用过Hudson的人,我颇有偏见,但我的看法是: Hudson的安装和运行起来非常容易(很大程度上是通过一个不错的Web界面),并且拥有一个非常活跃的插件开发社区。 CruiseControl获得了很多第三方的

  • 当扩展在其他板条箱中定义的特性时,似乎有两种默认实现新特性的方法。 性状的原始定义是 为了扩展该特征的功能,我们定义了一个特征, 现在,由于我们希望该功能在默认情况下可用,我们可以实现以下功能 我所观察到的是,当与trait对象混合时,这两种实现都是必需的。 我理解

  • 与...的循环中,该循环迭代每个键()并迭代键,用于...的值不迭代属性的值,即。为什么是那样? 在这里,我为...控制台循环的。它应该记录但它记录。为什么? 示例链接

  • 问题内容: 和触发器有什么区别? 问题答案: 没有区别,他们做同样的事情。 是相同的 一个触发是不同的,和火灾和前代替插入件,并且可以在视图中使用,以将相应的值到底层表。