数组上的c++ for循环
A C++ for loop on an array
我发现了一段很奇怪的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 23
4 5-858993460
2424376
12655176
13492888
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]为零。所以实际上你已经超出了数组的边界并且输出了一些脏数据
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么我的for循环不能正确获取argv
- 在基于范围的for循环中使用结构化绑定声明
- 通过for循环使用用户输入填充列表
- 使用for循环检查数组中的重复项
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 正在使用for循环创建QScatterSerie
- Python中的for循环与C++有何不同
- 在更改for循环的第三部分后,未使用for循环结果
- 在 for 循环中查找问题时遇到困难
- 嵌套for循环C++的问题(初学者)
- 如何用for循环在c++中生成单词三角形
- 如何在for循环中包含两个索引值的测试条件
- 带有多个独立参数的C++For循环
- 为什么我的程序在for循环中k=0时返回垃圾值
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- C++-For循环未执行
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++ 无法在字符数组中使用 for 循环打印字母模式