记c++易错(玄学)错误

记录一些容易一下调几个小时的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看上去在前面但实际上传入的时候已经被修改了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值