语死早写不短,楼主挑一点精简一下加入吧

0. 打开 -Wall 解君愁。
1. 运行错误多半是因为数组下标越界:定义 int a[100] 是定义了 a[0]~a[99] 共 100 个变量,不包括 a[100],使用 a[100] 就会导致下标越界。
2. 数组越界不一定会立刻报错,但是错误的内存使用会让整个程序发生无法预期的奇怪错误。如果你的程序出现了非常反常的错误可以试试检查之前有无发生数组越界。
3. 函数类型不是 void 却没有返回值会导致在大部分环境下运行错误。
4. (不考虑 static)函数外定义的变量为全局变量,函数内定义的变量为局部变量。定义在局部的变量的空间是存入非常宝贵的栈空间里的,所以定义在局部数组无法开的很大,否则会运行错误。数组特别大时需要开在全局,或使用动态分配(malloc / new / vector)。
5. 全局变量和静态变量会在程序开始执行之前自动初始化。这是通过在程序执行前执行特殊的代码段来实现的,这段代码段通常由编译器生成并在程序启动时执行。定义在局部的变量则不会被默认初始化,此时里面全都是随机值,需要手动赋值初始化(使用 for 循环赋值或者使用 memset)。
6. 没有额外写构造函数的结构体 struct 定义在局部一样需要初始化(不知道为什么很多人会记混)。
7. memset 填充以一个字节为单位,例如有一个 int 数组 a, memset(a, 1, sizeof(a)); 会给 a 数组里面的变量全部赋值为16843009 (二进制表示为 0000 0001 0000 0001 0000 0001 0000 0001B)。
8. STL 中的动态数组 vector 会自动扩容,而在扩容时内存会自动“搬家”,此时指向它们的指针(迭代器)就会全部变成野指针。
9. STL 中的优先队列 priority_queue 默认是大根堆。
10. 除会导致精度丢失。尽量把除的表达式改成乘的表达式。(如把 if (a / b < aa / bb) 改为 if (a * bb < aa* b) )
11. c++ 没有乘方符号,^ 是位异或。
12. int 只能存下比 2147483647(约 21 亿) 小的数,否则会让结果变成负数(俗称爆 int),常发生在乘法运算中。
13. 常数位爆 int 了,如:
1 << n
1ll << n
n = 50 时上面会爆 int 下面就不会。
14. cin 读完 int 会残留令其停止的字符在输入缓冲区。
15. 推荐输入输出和处理数据相互分离而不是写在同一个循环。否则处理多组数据时,边输入边处理数据,然后一个 break 把自己送走(上一组的数据没读完)。
16. 代码块(作用域)内外定义的变量是同一个名字时,所有操作均只对内层的变量进行。
17. sort 的比较函数必须是严格降序的否则会运行错误,如:
return x <= y; // RE
return x < y; // OK
return (block[a.l] & 1) ^ (a.r < b.r); // RE
return (block[a.l] & 1) ? (a.r < b.r) : (a.r > b.r); // OK