常见错误汇总
XyzL
2020-10-26 17:28:18
吾日三省吾身,为变量而不初始化乎?与大数算而不 ```long long``` 乎?不写文件乎?
[部分参考](https://wenku.baidu.com/view/00dd9b760a4e767f5acfa1c7aa00b52acfc79ca0.html)
# 低级错误:
## 1.文件读入问题
### 错误样例1:字符拼错
![](https://cdn.luogu.com.cn/upload/image_hosting/qyrx36h1.png)
![](https://cdn.luogu.com.cn/upload/image_hosting/2i0yock4.png)
这种情况建议,即使对自己英文水平再自信,也建议复制一遍 。
### 错误样例2:未开子文件夹
如果是提交文件夹的话,实在不清楚要不要开子文件夹,那就将代码在子文件夹内外**存两份**。
### 错误样例3:文件名搞混
T1?T2?傻乎乎弄不清。
### 错误样例4:大小写搞混
![](https://cdn.luogu.com.cn/upload/image_hosting/jfh631yu.png)
这种情况明显针对于像平时函数名带大小写,变量带大小写,~~以便码风美观~~的同学...
### 错误样例5:输出输入不匹配
```cpp
char -> "%c"
int short -> "%d"
long long -> "%lld"
float -> "%f"
double -> "%lf"
```
![](https://cdn.luogu.com.cn/upload/image_hosting/dvka1823.png)
经典图片...
## 2.头文件问题
头文件建议使用**万能头**文件...
**斜杠**方向要注意...
```cpp
#include <bits\stdc++.h> // 错误:Windows 彳亍,Linux 不 彳亍
#include <bits/stdc++.h> // 正确
```
## 3.输入问题
若输入数据量庞大,建议使用快读,而快读的类型也需要注意,建议使用 $template$ 。
## 4.输出问题
### 错误样例1:"$Yes/No$" or "$YES/NO$"
### 错误样例2: 输出变量类型
![](https://cdn.luogu.com.cn/upload/image_hosting/f5wcf2r3.png)
## 5.主函数没有 $return$ $0$ $;$
![](https://cdn.luogu.com.cn/upload/image_hosting/88p0lfpn.png)
![](https://cdn.luogu.com.cn/upload/image_hosting/bkrn4hvt.png)
话说现在没有 ```return 0;``` 也是可以的,但加上了又没有错...
## 6.赋值 "=" 与 判断 "==" 不分;
![](https://cdn.luogu.com.cn/upload/image_hosting/hlvz0xv4.png)
## 7.字符串和字符不分
```cpp
if (a[i] == 'A') {
// 判断字符串中的某个字符是否与'A'相等
}
if (strcmp(a, "A") == 0) {
// 判断字符串是否与字符串”A”相等
}
```
## 8.数据类型转换
$long$ $long$ $=$ $(long$ $long)$ $int$ $×$ $int$ (强制转换)
## 9.浮点运算精度丢失
考场建议使用精度高的 $double$ 进行运算...
## 10.注意某一句话是放在 $if$里面还是外面。
# 一般错误:
## 1.穷举法超时
穷举法最大的风险就是会出现运算**超时**,我们可以对输入的数据进行预判,以确定是否会超时。按考试评测机的配置,循环的次数的**最大值**可以大约在 $300000000$( $8$ 个 $0$ )。
(可能会更坑...
若实在找不到好的方法,可以用穷举法保证基本分...
## 2.数组定义过大
1.在主函数外的全局变量,数组最大可以约为: 400000000( 8 个 0 )。
![](https://cdn.luogu.com.cn/upload/image_hosting/d57f74cz.png)
2.在主函数内的局部变量,数组最大可以约为:500000(5个0)
![](https://cdn.luogu.com.cn/upload/image_hosting/1f7qgmlv.png)
**为减少比赛的失误,建议比赛时,若数组的长度超过$1000$。统一将其定义在主函数外面。**
## 3.初始化问题
重中之重...
多组数据初始化,
并查集初始化,
最短路初始化,
$ST$表初始化,
线段树初始化,
树状数组初始化,~~(诶,这个好像不要~~
$LCA$初始化...........
**初始化**一定要记住,尤其是子程序里面的初始化,如数组清空,重新赋值等等。
## 4.不要滥用 $STL$
如果不了解 $STL$ 的原理,各种数据结构的区别,使用 $STL$ 当然会吃亏。
别问我是怎么知道的...
## 5.不要滥用各种优化
同上,如 $register$ , $inline$ 等等,再没搞清楚基本原理和性质之前,建议不要使用。
## 6.函数记得赋予类型
在 $Dev-C++ 5.11$ 中,下面这个代码可以编译成功:
```cpp
#include <bits/stdc++.h>
using namespace std;
inline Init() {
}
int main() {
Init();
return 0;
}
```
emmm,有人考场检查的时候没检查出来,当场 $CE$ ,别问我是怎么知道的。
## 7.删/增 注释
调试代码的时候一本会写注释,但...
有时候我们**忘删掉或注释掉自己的测试代码**,于是...
出现各种奇葩情况,如多空行,多输出,玄学答案...
## 8.避免使用指针
emmm,如果您不是 $C$ 语言高级编程员,建议不要使用指针,因为它是动态的。
有时候一些致命错误就隐藏在其中。
~~如(没有释放指针,别问我是致命知道的~~
# 其他错误:
1. 倒序循环别忘了 $i--$ ...```for (int i = n; i >= 1; ++i)```
2. 除法无法取模...
3. 读入字符串 $%s$ 不加 & ...
4. 复制代码别忘了修改不同的变量...
5. 声明变量最好别用**某些单词**,如time...
6. 分数和小数比较 $int$ 除以 $int$ 还是整数,所以**强制转化**成 $double$ ...
7. 注意**值域下标**和**数组下标**的区别...
8. 注意**有向图**和**无向图**建边...
9. 有的图是**不联通**的,此时 $BFS$ 和 $DFS$ 前面都要加一重循环...
10. 不要 **滥用** $memset$ 函数,它不是 $O(1)$ 的...
11. 注意**模数以及数据大小**...
12. 注意**读入优化的负数与初始化**...
13. 遇到**位运算**一定要用**括号**括起来,如:```dp[1 << 18 + 5]``` $MLE$ ```dp[(1 << 18) + 5]``` $AC$
14. 0x3f 并不是**最大值**...
15. 注意变量重名,尤其是与全局变量...
16. 注意输出格式,是空格还是换行;多组数据之间是否要**额外换行**?(尤其是 $UVA$ )
17. 请注意 $Windows$ 系统与 $Linux$ 系统下 $rand()$ 函数值域的显著差异。
18. 库函数自带的 $max$ , $min$ 要求两个参数变量类型相同。
19. 自己手打的 $max$ ,$min$ ,是否满足所有变量,如出现既要比较 $double$ 又要 $long$ $long$ 的情况。
20. ```for (int j = 1; j <= n; ++i)```
# 欢迎增添
特别鸣谢大佬们的离子: [Imakf](https://www.luogu.com.cn/blog/Imakf/oier-cuo-wu-ge-ji) [BrokenSea](https://www.luogu.com.cn/user/89551)