报错及原因
语言细节
运算符的优先级
位运算
位运算的优先级是低于加减法的!因此希望位运算先计算的时候一定要记得加括号。
判断不清楚就直接加,保险。
Note:二分的时候是可以不加的:int mid = l + r >> 1;
三目运算符
写三目运算符的时候记得判断一下是否要加括号。
错误例子
希望计算一下前缀和,若 a [ i ] > = m i d a[i]>=mid a[i]>=mid 就当作 1 1 1,反之为 − 1 -1 −1,与前面的 s [ i − 1 ] s[i - 1] s[i−1] 相加。
错误的写法如下:
s[i] = s[i - 1] + a[i] >= mid ? 1 : -1;
这样写的话就会将 s[i - 1] + a[i]
先进行计算了。
正确写法
s[i] = s[i - 1] + (a[i] >= mid ? 1 : -1); //加括号
STL使用
在使用vector的时候,只要是输入的vector是空的,程序就会崩溃。调试了一下,发现此时 0 < vector.size()-1 这个值为true。这个时候才反应过来,stl中的.size()函数返回的是unsigned int,这个类型下进行0-1会发生越界,所以变成了一个极大值。所以以后一定要注意不要使用stl中的.size()做减法这样的操作,如果使用的话先用int来强转一下类型来防止越界。
所以以后遇见要使用stl的返回值的时候尽量先把它摘出来
int len = G[u].size();
函数使用
floor()函数得到的是0
错误例子
double x = 5.0;
printf("%d", floor(x)); //得到的是0
正确写法
要转为 int
。
double x = 5.0;
printf("%d", (int)floor(x)); //得到的是0
Runtime Error(ACCESS_VIOLATION)
是指程序运行到一半就崩溃了。
可能原因
- 除以0
- 数组或指针越界
- 数组开的太大
错误例子
指针的自增
写循环的时候写了一个:
while (a[j++] < x) {
ans += n - i + 1;
}
报错如上,可能是因为 j j j 越界了,因为执行完该判断就会进行 j + + j++ j++,而应当是满足条件之后再进行 j + + j++ j++ 操作。
判断条件的顺序问题
if (next.x < maxn && next.x >= 0 && !vis[next.x]) { //注意判断的顺序
next.m = now.m + 1;
q.push(next);
vis[next.x] = true;
}
判断条件的时候是从左往右判断的,而 vis
数组元素最多为 maxn
。 写的时候 !vis[next.x]
写在了第一位,就有可能越界。
CE
头文件
报错信息
VJ上交了POJ的题:
F:\temp\22334742.9233\Main.cc:12:24: error: unordered_map: No such file or directory
报错原因
POJ 的 C++ 版本太老了,不支持部分头文件。
如万能头、unordered_map
。
语法
结构体中运算符重载
报错信息
POJ G++:
In file included from algorithm:62,
from F:\temp\22345844.20335\Main.cc:8:
stl_algo.h: In function 'const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&) [with _Tp = node]':
stl_algo.h:2268: instantiated from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) [with _RandomAccessIterator = node*, _Size = int]'
stl_algo.h:5220: instantiated from 'void std::sort(_RAIter, _RAIter) [with _RAIter = node*]'
F:\temp\22345844.20335\Main.cc:58: instantiated from here
stl_algo.h:89: error: passing 'const node' as 'this' argument of 'bool node::operator<(const node&)' discards qualifiers
stl_algo.h:90: error: passing 'const node' as 'this' argument of 'bool node::operator<(const node&)' discards qualifiers
stl_algo.h:92: error: passing 'const node' as 'this' argument of 'bool node::operator<(const node&)' discards qualifiers
stl_algo.h:96: error: passing 'const node' as 'this' argument of 'bool node::operator<(const node&)' discards qualifiers
stl_algo.h:98: error: passing 'const node' as 'this' argument of 'bool node::operator<(const node&)' discards qualifiers
错误原因
看这篇博客。
大致的意思就是:将非变量传递的类型不一致导致错误。实际上IDE也有提醒啦加个 const
就行了。
正确写法
结构体中运算符重载正确写法:
struct node{
int x, y, h;
bool operator < (const node &b) const { //这里不加const会报错
return h < b.h;
}
}s[maxn * maxn];
之后排序直接美滋滋:
sort(s, s + cnt); //进行排列
WA
可能原因
-
忘记开 l o n g l o n g long \ long long long
-
忘记初始化
解决方法
-
先用题给的最大数据范围自己跑一遍,看一下最大值是多少。
-
如果会有多组数据,而样例只给了一组,可以直接复制一下,再跑一遍检查答案是否有错。