C,for循环变量的初始化位置不一样,计算后的结果也不同,求解答

BenjaminMa 发布于 2012/04/02 18:28
阅读 796
收藏 0

有一个冒泡排序的函数,用到了两个循环量 i和m;

1、先声明变量并初始化,代码如下:

  9 void bubbleSort(int *array, int size, int (*func)(int a, int b))
 10 {
 11
 12         int j=0;
 13         int m=1;
/*或者这样int j=0,m=1;*/
 14         for (;m<size;m++)
 15         {
 16                 for (;j<size-1;j++)
 17                 {
 18                         if ((*func)(array[j],array[j+1]))
 19                         {
 20                                 swap(&array[j],&array[j+1]);
 21                         }
 22                 }
 23         }
 24 }

此时外层只循环一次,冒泡排序值只工作一趟

[root@localhost source]# gcc -g pointer.c -o pointer
[root@localhost source]# ./pointer
print the example array:
2 76 3 74 1 44 87 3 6 4 9 10 95 32 14 84 11 6 11
Enter for kind of sort function:
(1 for ASC,2 for DESC):1
print the sorted array:
2 3 74 1 44 76 3 6 4 9 10 87 32 14 84 11 6 11 95
***************************

2、声明变量,在for语句中初始化

  9 void bubbleSort(int *array, int size, int (*func)(int a, int b))
 10 {
 11
 12         int j,m;
 13         for (m=1;m<size;m++)
 14         {
 15                 for (j=0;j<size-1;j++)
 16                 {
 17                         if ((*func)(array[j],array[j+1]))
 18                         {
 19                                 swap(&array[j],&array[j+1]);
 20                         }
 21                 }
 22         }
 23 }
此时完全工作正常:
[root@localhost source]# gcc -g pointer.c -o pointer
[root@localhost source]# ./pointer
print the example array:
2 76 3 74 1 44 87 3 6 4 9 10 95 32 14 84 11 6 11
Enter for kind of sort function:
(1 for ASC,2 for DESC):1
print the sorted array:
1 2 3 3 4 6 6 9 10 11 11 14 32 44 74 76 84 87 95
***************************
[root@localhost source]# ./pointer
print the example array:
2 76 3 74 1 44 87 3 6 4 9 10 95 32 14 84 11 6 11
Enter for kind of sort function:
(1 for ASC,2 for DESC):2
print the sorted array:
95 87 84 76 74 44 32 14 11 11 10 9 6 6 4 3 3 2 1
***************************
[root@localhost source]#
对这个问题很不解,请赐教。

加载中
0
晓寒
晓寒
第一个冒泡排序边界条件错了。
内层循环循环完一遍跳出时 j 的值为 size - 1, 而些时开始外层循环第二次,到内层时,注意,此时,因为你的 j 没有被赋值, j 的值还是 size - 1, 内层循环里判断 j < size  - 1 时,判断为假,跳出,开始外层第三次,如此,一直到外层循环结束。
第二个冒泡没有这个问题,因为内层 for 循环在每次开始时 都有 j = 0, 对 j 进行赋值了。所以这个可以正常排序。
另外,你这个冒泡的效率不好,因为,在第 N 次外层结束时,最后的N个已经是有序的了,没有必要再排,就是你内层循环的边界可以是 j  < size-m.
晓寒
晓寒
@Baz1nga : 静态分析结束之后,如果没有发现问题的原因的时候,单步调试是最好的方法,对于循环之类的,一般的错误都会在边界时出现,单步调试的时候多注意边界值,比较容易发现问题
BenjaminMa
BenjaminMa
原来是这样的错误,自己看了很久都没看出来,m可以先声明被赋值,j必须每次都要赋值为0。谢谢了。
0
中山野鬼
中山野鬼

楼主啊,你这个哪里是声明变量。

int j,m才是声明变量。你的问题和楼上说的一样。就是内测循环没有初始化的问题。

BenjaminMa
BenjaminMa
谢谢,发现问题了。
0
BenjaminMa
BenjaminMa

引用来自“中山野鬼”的答案

楼主啊,你这个哪里是声明变量。

int j,m才是声明变量。你的问题和楼上说的一样。就是内测循环没有初始化的问题。

表诉也不清楚,看来还是基础概念没有理解好。
0
中山野鬼
中山野鬼
这代码抄的还是自己写的?代码错误和引用函数指针,貌似不是一个层次的水平。哈哈。不过函数指针敢用这是好事情。
0
BenjaminMa
BenjaminMa

引用来自“中山野鬼”的答案

这代码抄的还是自己写的?代码错误和引用函数指针,貌似不是一个层次的水平。哈哈。不过函数指针敢用这是好事情。
一直写Java的,很少写C,最近想学数据结构,就拿C来写,几年没碰,很多基础的语法都忘了。
0
中山野鬼
中山野鬼

引用来自“Baz1nga”的答案

引用来自“中山野鬼”的答案

这代码抄的还是自己写的?代码错误和引用函数指针,貌似不是一个层次的水平。哈哈。不过函数指针敢用这是好事情。
一直写Java的,很少写C,最近想学数据结构,就拿C来写,几年没碰,很多基础的语法都忘了。
那你会不是一般的郁闷。JAVA转C,确实很头疼。如果C++转JAVA,基本上几天就上手了。包不包的,需要时间。
0
BenjaminMa
BenjaminMa

引用来自“中山野鬼”的答案

引用来自“Baz1nga”的答案

引用来自“中山野鬼”的答案

这代码抄的还是自己写的?代码错误和引用函数指针,貌似不是一个层次的水平。哈哈。不过函数指针敢用这是好事情。
一直写Java的,很少写C,最近想学数据结构,就拿C来写,几年没碰,很多基础的语法都忘了。
那你会不是一般的郁闷。JAVA转C,确实很头疼。如果C++转JAVA,基本上几天就上手了。包不包的,需要时间。
是啊,最近也在看你那篇关于Linux C和make的,就是准备从Java web往服务器开发转了,C++暂时没去碰,Java和C也能做很多事情。
返回顶部
顶部