目录

傻缺错误大赏

一部分转自studyingfather的lg博客,另一部分是自己的毒瘤经历

正文开始

记得开-Wall

0. mod取过模的数时别忘了加mod…………

1.赋值运算符与等于号不分(在开启连字时尤为明显

1
2
3
//使用-Wall编译选项会出现警告
if(n=1)puts("Yes");//此处应为n==1
else puts("No");

2.循环变量错误

1
2
3
4
5
6
7
for(int i=1;i<=n;i++)
 for(int j=1;j<=n;i++)//显然应该是j++
  //do something

for(int i=1;i<=n;i++)
 for(int j=n;j>=1;j++)//显然应该是j--
  //do something

4.多组数据下未初始化变量&&局部变量未赋初值

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//比较好的习惯是将变量定义在循环内,从而求解每组数据时都能初始化变量
#include <stdio.h>
int sum;
int main()
{
 int T;
 scanf("%d",&T);
 while(T--)
 {
  //int sum=0;
  //像上面这样定义变量就不会出事了
  int n;
  scanf("%d",&n);
  for(int i=1;i<=n;i++)
  {
   int num;
   scanf("%d",&num);
   sum+=num;
  }
  printf("%d\n",sum);
 }
 return 0;
}

Another Example:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
struct pencil
{
 int shuliang,jiage;
}a[5];
int main()
{
 //freopen("pencil.in","r",stdin);
 //freopen("pencil.out","w",stdout);
 int n,ans;//ans没有初始化,损失惨重
 //打开-Wall会发出警告
 scanf("%d",&n);
 for(int i=1;i<=3;i++)
 {
  scanf("%d%d",&a[i].shuliang,&a[i].jiage);
  ans=min(ans,(int)ceil(n*1.0/a[i].shuliang)*a[i].jiage);
 }
 printf("%d",ans);
 //fclose(stdin);
 //fclose(stdout);
 return 0;
}

5.Where is my output?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
 freopen("a.out","w",stdout);
 ios::sync_with_stdio(false);
 cout<<1;//正确的写法是cout<<1<<endl;
 //在关闭与stdio的同步后,一定在每行输出结束时加上endl来刷新缓冲区
 //否则输出将无法立刻被写入输出文件
 //无论何时,每行输出都以换行符结尾都是一个好习惯(即使只有一行输出的时候也是)
 fclose(stdout);
 //不使用fclose时,理论上会在程序结束时先输出缓冲区内容,随后关闭文件
 //因此不使用fclose不会产生缓冲区内容无法输出的问题
 //但还是建议在考场上加上fclose,这时一定要注意这个问题
 return 0;//缓冲区的内容将在缓冲区满或程序结束时才会输出,但这时已经无法写入文件了
}

6.关闭同步、混用输出(直接抬走

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
//这个例子将说明,关闭与stdio的同步后,混用两种IO的后果
//建议单步运行来观察效果
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
 ios::sync_with_stdio(false);
 //关闭IO后,cin/cout将使用独立缓冲区,而不是将输出同步至scanf/printf的缓冲区,从而减少IO耗时
 cout<<"a\n";
 //cout下,使用'\n'换行时,内容会被缓冲而不会被立刻输出,应该使用endl来换行并立刻刷新缓冲区
 printf("b\n");
 //printf的'\n'会刷新printf的缓冲区,导致输出错位
 cout<<"c\n";
 return 0;//程序结束时,cout的缓冲区才会被输出
}

7.运算符优先级问题

1
2
int a=num<<2+1;//这里会被解读为num<<(2+1)
a=(num<<2)+1;

8.无向图建边时没有开双倍空间

1
2
3
struct EDGE {
  int next, to;
} edge[maxn * 2];

9.dfs时没有存初始值

(适用于需要更新状态的情况) for example: [BZOJ2466]树

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
void dfs(int x, int fa) {
  doNotpress[x][1] = press[x][0] = 110;
  press[x][1] = 1;
  doNotpress[x][0] = 0;
  for (int i = head[x]; i; i = edge[i].next) {
    if (edge[i].to == fa) continue;
    int p1 = press[x][1], p0 = press[x][0], np1 = doNotpress[x][1],
        np0 = doNotpress[x][0]; // 注意这一坨
    dfs(edge[i].to, x);
    press[x][0] =
        min(p1 + press[edge[i].to][0], p0 + doNotpress[edge[i].to][0]);
    press[x][1] =
        min(p0 + press[edge[i].to][0], p1 + doNotpress[edge[i].to][0]);
    doNotpress[x][0] =
        min(np1 + press[edge[i].to][1], np0 + doNotpress[edge[i].to][1]);
    doNotpress[x][1] =
        min(np0 + press[edge[i].to][1], np1 + doNotpress[edge[i].to][1]);
  }
}

10.记得初始化所有变量

1
2
3
//案例:链式前向星存图,且有多组数据
memset(edge, 0, sizeof(edge));
memset(head, 0, sizeof(head)); //别忘了这句话