|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 houqing1999 于 2023-7-5 19:50 编辑
//这个冒泡排序在Visual Studio环境下运行出现一些警告,请问这些警告通俗的讲是什么意思,以及怎么修改程序来消除这些警告,如图:
- #define _CRT_SECURE_NO_WARNINGS 1
- #include <stdio.h>
- #include <stdbool.h>
- typedef int ElemType;
- void bubble_sort(ElemType array[], int length);
- void swap(int* a, int* b);
- void swap(int* a, int* b)
- {
- int temp = a;
- a = b;
- b = temp;
- }
- void bubble_sort(ElemType array[], int length)
- {
- int i, j;
- for (i = 0; i < length - 1; i++)
- {
- bool flag = false;
- for (j = length-1; j > i; j--)
- {
- if (array[j-1] > array[j])
- {
- swap(array[j - 1], array[j]);
- flag = true;
- }
- if (flag == false)
- {
- return;
- }
- }
- }
- }
- int main(void)
- {
- int array[] = { 73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109 };
- int i, length;
- length = sizeof(array) / sizeof(array[0]);
- bubble_sort(array, length);
- printf("排序后的结果是:");
- for (i = 0; i < length; i++)
- {
- printf("%d ", array[i]);
- }
- putchar('\n');
- return 0;
- }
复制代码
还想问一下30行为什么不用rerurn 0;
- if (flag == false)
- {
- return;
- }
复制代码
家人们修改后的代码没有警告了但我不知道为什么把swap函数里的解引用*去掉后就没事了,仅此问题解决我设置为最佳答案,谢谢。
- #include <stdio.h>
- #include <stdbool.h>
- typedef int ElemType;
- void bubble_sort(ElemType array[], int length);
- void swap(int a, int b);
- void swap(int a, int b)
- {
- int temp = a;
- a = b;
- b = temp;
- }
- void bubble_sort(ElemType array[], int length)
- {
- int i, j;
- for (i = 0; i < length - 1; i++)
- {
- bool flag = false;
- for (j = length-1; j > i; j--)
- {
- if (array[j-1] > array[j])
- {
- swap(array[j - 1], array[j]);
- flag = true;
- }
- if (!flag)
- {
- return;
- }
- }
- }
- }
- int main(void)
- {
- int array[] = { 73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109 };
- int i, length;
- length = sizeof(array) / sizeof(array[0]);
- bubble_sort(array, length);
- printf("排序后的结果是:");
- for (i = 0; i < length; i++)
- {
- printf("%d ", array[i]);
- }
- putchar('\n');
- return 0;
- }
复制代码
这些警告通常指示代码中存在一些潜在的问题或不安全的行为。对于这个冒泡排序程序,以下是关于警告的解释和修改方法:
1. "将 int* 类型转换为 int":
这个警告出现在 `swap` 函数中,因为你错误地将 `int` 类型的指针 `a` 和 `b` 分别赋值给了 `temp`。正确的做法是将 `*a` 和 `*b` 的值赋给 `temp`,即使用解引用操作符 `*`:`int temp = *a;` 和 `*a = *b;` 和 `*b = temp;`。
修改后的 `swap` 函数如下:
- void swap(int* a, int* b)
- {
- int temp = *a;
- *a = *b;
- *b = temp;
- }
复制代码
2. "if 语句永远是 true":
这个警告出现在 `bubble_sort` 函数中的条件判断 `if (flag == false)` 外面。由于该条件判断位于内层循环中,当 `flag` 第一次变为 `false` 时,程序会立即执行 `return`,导致提前退出循环,无法对整个数组进行完整的排序。因此,应将该条件判断移至外层循环之后。
修改后的 `bubble_sort` 函数如下:
- void bubble_sort(ElemType array[], int length)
- {
- int i, j;
- for (i = 0; i < length - 1; i++)
- {
- bool flag = false;
- for (j = length-1; j > i; j--)
- {
- if (array[j-1] > array[j])
- {
- swap(&array[j - 1], &array[j]);
- flag = true;
- }
- }
- if (flag == false)
- {
- return;
- }
- }
- }
复制代码
至于为什么你移除了 `swap` 函数中的解引用操作符 `*` 后不再出现警告,这是因为修改后的 `swap` 函数参数类型由指针变为了整型 `int`。解引用操作符在这种情况下不再需要。
希望以上解释和修改能够帮助你理解并消除代码中的警告。如果有任何疑问,请随时提问。
|
|