我发现我返回的参数在调用外部函数时与在本地函数中不同。我在代码的每个部分都设置了一些打印输出,但仍然不知道为什么没有返回参数 i:
int assign_cookie(vector<int>& g, vector<int>& s){
if(s.size()==0 || g.size()==0){
cout << "size = 0, returning 0" << endl;
return 0;
}
cout << "s.size() = " << s.size() << endl;
cout << "g.size() = " << g.size() << endl;
sort(g.begin(), g.end());
sort(s.begin(), s.end());
unsigned int i, j = 0;
while(i<g.size() && j<s.size()){
if(g[i]<=s[j]) i++;
j++;
}
cout << "(assign_cookie) i = " << i << endl;
return i;
}
当我在main函数中调用时如下:
int main(){
int g[] = {1,2,3};
int s[] = {1,1};
vector<int> vg (g, g+3);
vector<int> vs (s, s+2);
int result = assign_cookie(vg,vs);
cout << "result = " << result << endl;
}
我得到的结果如下:
s.size() = 2
g.size() = 3
(assign_cookie) i = 1
(main) result = 0
我对结果很困惑。任何人都知道发生了什么事? 预先感谢您的帮助!
最佳答案
你有未定义的行为,因为这里
unsigned int i,j=0;
你只初始化了 j
但没有初始化 i
然后你使用 i
作为 g[i]
中的索引从未赋予它有意义的值(value)。因此它是 UB,任何事情都可能发生。实际上这是一个有趣的 UB 案例,就像你做的那样
unsigned int i,j=0;
std::cout << "i = " << i << "\n";
它仍然打印
i = 0
(assign_cookie) i = 1
result = 0
see also here .即使编译器似乎将 i
初始化为 0
,它仍然意识到存在 UB 并可以自由地产生垃圾输出。
关于c++ 返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42877549/