记录一些容易一下调几个小时的naive错误
1.vector
#include<bits/stdc++.h>
using namespace std;
struct gg{
int w,nxt;
}tp;
vector<gg>a;
int id[10],sz;
int new_node(int x)
{
tp.w=x,tp.nxt=0;
a.push_back(tp);
return sz++;
}
int main()
{
sz=2,tp.w=1;
a.push_back(tp);
a[0].nxt=new_node(2);
cout<<a[0].nxt;
}
正常人觉得这个代码输出的肯定是2吧,然而它输出了0...
然后注释掉new_node里的第2行
#include<bits/stdc++.h>
using namespace std;
struct gg{
int w,nxt;
}tp;
vector<gg>a;
int id[10],sz;
int new_node(int x)
{
tp.w=x,tp.nxt=0;
// a.push_back(tp);
return sz++;
}
int main()
{
sz=2,tp.w=1;
a.push_back(tp);
a[0].nxt=new_node(2);
cout<<a[0].nxt;
}
输出就正常的是2了。(原因应该是c++实现vector时加入一个数可能会影响到之前的地址)
2.函数调用顺序
#include<bits/stdc++.h>
#define pii pair<int,int>
#define fi first
#define sc second
using namespace std;
pii a;
void gao(int x,int y)
{printf("%d %d\n",x,y);}
int f(pii &x)
{
x.fi=2;
return 2;
}
int main()
{
a.fi=1,a.sc=1;
gao(a.fi,f(a));
}
看上去应该输出1,2但是实际上会输出2,2,这是因为c++内调用嵌套函数并不会按从左到右先传入最外层函数的变量然后遇到嵌套去递归执行嵌套内部的,而是应该先将嵌套在内层的函数执行完再统一传入外层函数,因此a.fi看上去在前面但实际上传入的时候已经被修改了。