马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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`。解引用操作符在这种情况下不再需要。
希望以上解释和修改能够帮助你理解并消除代码中的警告。如果有任何疑问,请随时提问。
|