数组上的c++ for循环

A C++ for loop on an array

本文关键字:for 循环 c++ 数组      更新时间:2023-10-16

我发现了一段很奇怪的c++代码。有人能给我解释一下for循环条件吗?
为什么只有数组和索引变量?

include <iostream>
using namespace std;
int main()
{
   int a[] = {1, 2, 3, 4, 5};
   for (int i = 0; a[i];i++){
      cout << a[i] << endl;
   }
  return 0;
}

结果是:

1

2

3

4

5

-858993460

2424376

12655176

1

3492888

3483368

1402216725

为什么输出12个元素?那额外的7个元素是从哪里来的?很多谢谢!

在C/c++中,可以用数字代替布尔条件。当这种情况发生时,当数字为零时,结果被认为是false;否则,视为true

现在您可以很容易地看到循环有一个无效的终止条件:当在数组中找到第一个零时,它期望停止,但是数组中没有零,因此循环继续超出数组边界。在您的例子中,它在额外的七次迭代后找到一个零,产生垃圾值(它可能会崩溃,因为它是未定义的行为)。

将数组初始化式更改为包含0可以解决这个问题:

int a[] = {1, 2, 3, 4, 5, 0};

当然,迭代到数组中元素的个数也是可以的。

表达式

a[i]

等于

a[i] != 0

在需要条件的上下文中。因此循环迭代,直到在数组中找到一个为零的元素。由于数组绑定中的任何元素都不满足此条件,因此代码将数组读入边界之外,因此程序调用未定义行为(并在请求的内存位置打印值,这似乎是垃圾)。

代码有未定义的行为,所以任何事情都可能发生。这个数组有5个元素,所以允许解引用的最后一个索引是4。一旦你使用了arr[5]的value,你的程序就无可救药地脱轨了。

(在这个特殊的运行中,它可能在第13个槽中发现了一个看起来为0的垃圾,因此停在那里,但正如前面提到的,如果您根本没有看到任何输出或已经给您的老板发了邮件,它也可以)。

这是一个未定义的行为。在你的情况下,循环终止条件是a[i] !=0,这是发生在12个元素后越过数组边界。

您访问超出数组长度,因此您无法预测程序向输出写入超过5个成员后的值(其中i> 4),这就是程序导致未定义行为的原因。程序将一直运行,直到它意外遇到一个值i,其中a[i]等于0。

你可以像这样修改代码

unsigned length = sizeof(a) / sizeof(a[0]);
for (int i = 0; i < length ;i++){
      cout << a[i] << endl;
}

循环停止的条件是a[I],等于a[I]为零。所以实际上你已经超出了数组的边界并且输出了一些脏数据