c++ - 这个函数发生了什么?
问题描述
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
int print_vector(vector<int> &data) {
int size = data.size();
cout<< "size " << size << endl;
for(int i = 0;i < size;i++) {
if(data[i] == 3) {
return i;
}
cout<< data[i] << endl;
}
cout<< "Hello!" << endl;
return data.size() - 1;
}
int main() {
vector<int> data = {1,2,3,4,5};
cout<< print_vector(data) << endl;
}
当我运行我的代码时,一旦它到达我的if
语句,它就会返回i
,然后返回data.size()
只有 2,如果我这样做data.size() -1
,它仍然是 2。
为什么会这样?有人可以帮忙吗?
解决方案
如果我们跟踪程序中的控制流,那么发生的事情应该很明显:
- 从
main
我们打电话print_vector(data)
- 第一个输出
size 5
来自cout<< "size " << size << endl;
- 我们进入
for
-loop:- 第一次迭代 (
i == 0
,data[i] == 1
)if(data[i] == 3)
评估为false
- 我们
1
从cout<< data[i] << endl;
- 第二次迭代 (
i == 1
,data[i] == 2
)if(data[i] == 3)
评估为false
- 我们
2
从cout<< data[i] << endl;
- 第三次迭代 (
i == 2
,data[i] == 3
)if(data[i] == 3)
评估为true
i
我们通过返回(即2
)来打破循环
- 第一次迭代 (
- 返回的值
print_vector
打印在cout<< print_vector(data) << endl;
所以你得到的输出是
size 5
1
2
2
该函数不会返回两次(这是不可能的),向量的大小也不会神奇地减小。事实上,您只打印一次大小,因此没有理由期望这些数字中的任何一个(第一个除外)与向量大小相关。
推荐阅读
- sql-server - SQL Server SELECT * INTO 临时表是否保留确切的列数据类型?
- grails - 输入列表的 Grails 命令对象验证
- graph-databases - Amazon Neptune - 不等于谓词在使用 bothE() 时不适用于边缘标签
- xslt - 特定节点子集的 xslt 文本过滤器
- sharepoint - 在 dotnet core 中获取 SharepointOnline 的 AuthToken
- android - Android EXIF 方向总是返回 1
- c++ - CMakeList.txt 中应包含哪些模块以进行近似最近邻搜索?
- selenium - 如何在 pytest-html 报告中列出已安装的包和环境变量?
- php - 从正则表达式中获取所有名称
- xml - 是否有 SSIS 连接器来获取 .xel 文件(扩展事件)?和方法修正