A CIN Rrick

    今天写Bellman-Ford的时候,由于要输入数组,于是乎,我为了图省事,直接在for循环中放入 cin >> beg[i] >> end[i] >> val[beg[i]][end[i]]; 写完程序运行发现最短路径的长度全部都是0。于是我怀疑是数据输入的时候出了问题。调试才发现,不管向val的数组输入什么,数据全部都为0。我感到非常奇怪。于是写了几个小程序看了看:

 

Program 1:

  // Outside main

  int beg[MaxV], end[MaxV];

  int val[MaxV][MaxV];

  // Inside main

  ...

  for (int i = 0; i != Vertex; ++i) {

    cin >> beg[i] >> end[i] >> val[beg[i]][end[i]];

  }

  ...

  // val全为0

Program 2:

  // Inside main

  int beg[MaxV], end[MaxV];

   int val[MaxV][MaxV];

  ...

  for (int i = 0; i != Vertex; ++i) {

    cin >> beg[i] >> end[i] >> val[beg[i]][end[i]];

  }

  ...

  // 输入到第一个val时就报错(貌似是数组越界)

Program 3:

  // Inside main

  int beg[MaxV], end[MaxV];

   int val[MaxV][MaxV];

  ...

  for (int i = 0; i != Vertex; ++i) {

    cin >> beg[i] >> end[i];

    cin >> val[beg[i]][end[i]];

  }

  ...

  // 正确

 

分析:

    Program 1 和 Program 2 最大的区别就在于数组是否进行了初始化。因此,我怀疑是不是cin读入的时候是不是先把输入数据一次性读入,然后从最右边的变量一个一个赋值进去。正因为 Program 2 未初始化,所以到时赋值的时候数组越界了。当然,这只是我一个猜测,如果要真正弄明白的话,就得看看cin是如何实现的了。

 

    通过以上的小测试可以看出,编程是件细腻的活。严格的遵守C++编程风格的约定,才能将BUG降到最低。认认真真写下每一行代码,是我们每个程序员应尽的责任。我想应该不仅仅是责任,更应该是一种本能,程序员的本能...

posted @ 2010-10-27 23:19  玫瑰De葬礼  阅读(178)  评论(0)    收藏  举报