以前学C,在写for循环的时候,更倾向于写等号控制范围,这样我一眼就知道最后一位i是多少。
for(int i=1;i<=N;i++)
{
;
}
//或是
for(int i=0;i<=N-1;i++)
{
;
}
但今天这个习惯却让我差点怀疑人生。
我在写图的dfs时,学习了别人的代码。然后自己写,却发现他的就是对的,我的就段错误。
我把它拿了出来,逐一对比。
vector<int>G[100005];
//我写的
void dfs(int x,int id) //v点 id当前最大点
{
if(A[x]) return; //有值即最大
A[x] = id; //能到即存
for(int i=0;i<=G[x].size()-1;i++)
{
dfs(G[x][i],id);
}
}
//别人写的
void dfs(int x, int d)
{
if(A[x]) return; //访问过
A[x] = d;
for(int i=0; i<G[x].size(); i++)
dfs(G[x][i],d);
}
看起来一模一样,对吧。
但执行起来却千差万别。
最后我才怀疑是vector遍历的问题,因为网上大家似乎都用下边这种"<",根本没看到人用"<="。
我搜到了这位的blog
https://blog.youkuaiyun.com/daiweijieshang/article/details/77934917
自己也调试了一下。
就是vec.size()-1的问题。
当vec.size()为0时,一切是正常的,于是我的第一个循环没有进入。
但当vec.size()-1时,却变成了184467440..... 贼恐怖的一个数,然后..然后第二个循环出问题,直接段错误了。
看了大佬的博客才知道,原来vec.size()是个unsigned int ,也就是没有负数的。
(这一点,很多人遍历定义i会用size_t,而size_t这种类型就是long long unsigned int ,这其实也暗示了)
那这就明白了。
以前曾学过翁恺老师的课。
我的理解就是,int、char类型都是整数,也就是直接的二进制存储。
他们的数据是一个闭环,无论有没有正负。
以上就是char的存储图,当我写下'char a = 128",按整形输出char,结果就是-128,因为它越界了,表示了不能表示的数据。
同理,对于unsigned int.
这也是一个闭环。
综上,这个特殊的unsigned int 点还是要记一下的。