我无法理解这两个代码之间的区别,因为它们给了我相同的输出?
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;
}
}
这两个代码将提供相同的输出。但是在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
具有不同的值。
在第一个片段中,x是数组元素的副本,在第二个片段中它是一个引用。第二个片段确实增加了数组中的每个元素,但您没有观察到这一点。
写循环最自然的方法是
for (auto&& x : v) {
查看在基于范围的for循环中使用转发引用的优势是什么?以获取解释。
从很多方面来说,很遗憾速记
for (x : v) {
(这意味着自动
第一个代码片段将显示数组中的每个元素,而不带任何引用(即,它们修改后的值不会应用于原始数组中,因为这只是一个副本)。
另一方面,另一个片段表示它将首先输出元素,然后元素的值将增加一,并且v
将被更改。
我知道什么是“代号”...在循环中(它迭代键),但我听说过(它迭代值)。 我对循环。 我知道迭代属性值。那么为什么它不记录而不记录? 与用于...的循环中,该循环迭代每个键()并迭代键,不迭代属性的值,即。为什么会这样? 在这里,我控制台的循环。它应该记录,但它记录。为什么? 示例链接
问题内容: 我知道什么是循环(对键进行迭代),但是第一次听说(对值进行迭代)。 我对循环感到困惑。我没有形容词。这是下面的代码: 我得到的是,遍历属性值。那么,为什么它不记录(返回)而不是?但是循环遍历每个键()。在这里,循环还会遍历键。但是不会迭代财产的价值,即。为什么会这样呢? 总而言之: 在这里,我控制台循环。它应该记录,但是在这里记录。为什么呢 问题答案: 遍历对象的可枚举属性名称。 (E
问题内容: 我认为标题总结了这一点。我只是想知道为什么对于从Svn进行Java项目的持续集成构建而言,一个或另一个更好。 问题答案: 作为CruiseControl的长期提交者 以及 从未使用过Hudson的人,我颇有偏见,但我的看法是: Hudson的安装和运行起来非常容易(很大程度上是通过一个不错的Web界面),并且拥有一个非常活跃的插件开发社区。 CruiseControl获得了很多第三方的
当扩展在其他板条箱中定义的特性时,似乎有两种默认实现新特性的方法。 性状的原始定义是 为了扩展该特征的功能,我们定义了一个特征, 现在,由于我们希望该功能在默认情况下可用,我们可以实现以下功能 我所观察到的是,当与trait对象混合时,这两种实现都是必需的。 我理解
与...的循环中,该循环迭代每个键()并迭代键,用于...的值不迭代属性的值,即。为什么是那样? 在这里,我为...控制台循环的。它应该记录但它记录。为什么? 示例链接
问题内容: 和触发器有什么区别? 问题答案: 没有区别,他们做同样的事情。 是相同的 一个触发是不同的,和火灾和前代替插入件,并且可以在视图中使用,以将相应的值到底层表。