【问题标题】:C++ - Replace int elements of an array with anotherC ++ - 用另一个替换数组的int元素
【发布时间】:2012-11-13 07:47:02
【问题描述】:

我一直在阅读 C++ Primer 的第四版,现在我正在进行指针练习。该练习要求编写一个程序来遍历数组并将元素替换为 0。到目前为止,我有这个:

#include <iostream>

using namespace std;

using std::cout;
using std::endl;

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    for (int i = 0; i != 5; i++)
        arr[i] = 0;
        cout << arr[i] << endl;
}

但我收到一个错误:

name lookup of 'i' changed for ISO 'for' scoping

如何更改元素?

【问题讨论】:

  • 不要将您的代码作为图片发布。将代码作为文本发布在这里。此外,您的代码缺少详细信息(您遇到了哪些错误?)——代码应该可以正常工作。
  • 在其他地方的图片链接到底如何比代码更好,尤其是当 SO 能够将代码集成到帖子中时?除此之外,我认为这是一个指针练习。这里没有指针。
  • 您可能想要发布您遇到的各种错误。
  • 我不太确定如何在问题中格式化它。但这里是:#include using namespace std;使用 std::cout;使用 std::endl; int main() { int arr[5] = {1,2,3,4,5}; for (int i = 0; i != 5; ++i) arr[i] = 0; cout
  • @David,您插入了原版中没有的大括号,意外地解决了一个问题。

标签: c++ arrays scope


【解决方案1】:

你的循环应该是这样的:

for (int i = 0; i != 5; i++) {
  arr[i] = 0;
  cout << arr[i] << endl;
}

我还建议您将 return 0; 放在最后的 } 之前。

【讨论】:

  • 天哪,我不敢相信我忘记了牙套。感谢您的快速回复。
  • @user1851663 大括号是可选的当且仅当它后面有一个表达式。
  • I also recommend you put return 0; before the final }. 为什么?这是完全没有必要的。
  • @David 我的偏好是始终包含大括号——不仅因为它捕获偶尔的错误,还因为版本控制。修改if 的主体的人没有充分的理由最终也会在条件线上产生一个增量,因为添加和删除大括号是微不足道的乒乓球。
  • 另外,常见的循环终止是使用&lt; 运算符,如:for(unsigned int i = 0; i &lt; 5; ++i)
【解决方案2】:
for (int i = 0; i != 5; i++)
    arr[i] = 0;
    cout << arr[i] << endl;

您忘记了{}。这意味着以 cout 开头的行目前不是循环的一部分,因此,i 超出了范围。

这个错误有点误导,因为它关注的是这个曾经在很多很多年前是有效的。

但与其他一些语言不同,块范围由{} 定义,而不是缩进。因此,写:

for (int i = 0; i != 5; i++) {
    arr[i] = 0;
    cout << arr[i] << endl;
}

取得巨大成功。

【讨论】:

  • 它曾经确实有效,但是如果你用旧的编译器编译它,它就不会按照作者想要的方式编译。编译器无法从缩进中意识到缺少大括号(尽管如果基于缩进发出一些警告会很好),并且它会在循环之后编译最后一条语句,这不是缩进。
  • @AlexeyFeldgendler:我认为没有人会质疑 OP 的代码有误......
【解决方案3】:

嗯,应该是这样的:记住 5 个元素只来自数组索引0 to 4

#include <iostream>

using namespace std;

using std::cout;
using std::endl;

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    for (int i = 0; i < 5; i++){
        arr[i] = 0;
        cout << arr[i] << endl;
    }
}

!= 更改为&lt; 并为for 循环添加大括号。

【讨论】:

  • != 很好,但出于风格原因,我也推荐&lt;
【解决方案4】:

您的 for 循环缺少它的主体。你需要花括号

arr[i] = 0;
cout << arr[i] << endl;

所以编译器知道代码是 for 循环的主体。

【讨论】:

  • 这个答案如何真正为其他答案中给出的信息添加任何内容,尤其是this one
猜你喜欢
  • 1970-01-01
  • 2013-07-04
  • 2019-12-20
  • 2016-11-11
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
相关资源
最近更新 更多