c++ - 为什么我有一个无限循环?简单的问题,简短的代码
问题描述
如果输入数组是空的,那么array.size()
应该是 0。第一个for
,从0
to array.size() - 1
,应该意味着它从0
to -1
,对吧?
for
然后,不应输入此值,并且该函数应返回 inversionsCounter 值,该值将是0
但这并没有发生,代码进入了一个无限循环。为什么是这样?
这是代码:
#include <vector>
#include <iostream>
using namespace std;
int countInversions(vector<int> array)
{
int inversionsCounter = 0;
for (int i = 0; i < array.size() - 1; ++i)
for (int j = i + 1; j < array.size(); ++j)
if (array[i] > array[j])
++inversionsCounter;
return inversionsCounter;
}
int main()
{
vector<int> array = {};
cout << array.size();
cout << countInversions(array);
}
解决方案
size
类模板的成员函数返回值的std::vector
类型是无符号整数类型,通常等价于类型size_t
。
所以在for循环的条件下
for (int i = 0; i < array.size() - 1; ++i)
由于通常的算术转换,表达式的两个操作数
i < array.size() - 1
被转换为与 type 对应的无符号整数类型std::vector<int>::size_type
。因此,当成员函数返回 0时,表达式array.size() - 1
将转换为该类型的最大值。size
这是一个演示程序。
#include <iostream>
#include <iomanip>
int main()
{
std::cout << size_t( -1 ) << '\n';
std::cout << std::boolalpha << ( 0 < size_t( -1 ) ) << '\n';
return 0;
}
它的输出是
18446744073709551615
true
所以当成员函数size
返回 0 你实际上有一个像这样的循环
for (int i = 0; i < 18446744073709551615; ++i)
而不是类型int
,您应该至少使用size_t
索引类型。外循环应该看起来像
for ( size_t i = 0; i < array.size(); ++i )
推荐阅读
- spring - java.lang.IllegalStateException: block()/blockFirst()/blockLast() 是阻塞的,线程 reactor-http-kqueue-4 不支持
- r - 如何为数据框中的每个唯一值创建多个栅格?
- ios - 绑定模型和视图:如何观察对象属性
- javascript - 反应待办事项列表 - 复选框没有改变
- r - R:如何读取以“##”开头的注释行和一些以“#”开头的常规行的文件
- c - 有什么方法可以在main中打印出函数的返回值吗?
- spring-boot - 使用 Gradle Kotlin DSL 为不同项目定义通用依赖项和插件版本
- angular - Angular CdkDragDrop - 在放置事件上识别目标组件
- php - 有没有办法用 onclick 按钮调用 php 函数?(不把函数放在自己的文件中(教师请求))
- android - 为什么TextTheme不会改变AppBar TextStyle?