C语言数组去重打印程序如何精简冗余变量优化代码结构
C语言数组去重打印代码优化
你现有代码存在几个明显的可优化点,甚至有隐藏的运行风险:
- 存在未定义行为:局部变量
duplicate_num、count声明后没有初始化就直接参与运算,当前能得到正确输出完全是巧合——栈内存上的随机值刚好不在你的测试数组里,换个编译环境或者测试用例大概率会输出错误结果。 - 逻辑冗余绕弯:通过
count变量反复回退数组指针和遍历索引的写法可读性极差,维护成本很高,也额外引入了更多不必要的状态变量。 - 有意外副作用:函数会直接修改传入的原数组内容,如果后续代码还要使用原数组就会出问题。
更简洁的实现方案
最符合直觉的去重逻辑是:遍历每个元素时,检查它是否在当前位置之前的元素里出现过,没出现过就打印,出现过就直接跳过。整个逻辑顺向执行,不需要回退指针,也不需要修改原数组,变量极少:
#include <stdio.h> #define N 10 void print_set(const int *arr, int n) { if (n <= 0) return; // 先打印第一个元素 printf("%d", arr[0]); // 从第二个元素开始逐个检查 for (int i = 1; i < n; i++) { int duplicated = 0; // 对比当前元素之前的所有值 for (int j = 0; j < i; j++) { if (arr[i] == arr[j]) { duplicated = 1; break; } } if (!duplicated) { printf(" %d", arr[i]); } } } int main() { int arr[N] = {4, 6, 9, 8, 6, 9, 6, 1, 6, 6}; print_set(&arr[0], N); return 0; }
运行后输出和你预期一致:4 6 9 8 1
优化点说明
- 砍掉了所有非必要变量:不需要额外的标记值、计数器,也不需要手动移动指针,循环变量直接在
for语句中声明,作用域清晰,完全避免了未初始化变量的问题。 - 用
const修饰数组形参,明确告知调用者这个函数不会修改原数组,避免意外的副作用。 - 增加了边界校验:传入空数组或者长度为负的非法值时直接返回,不会触发内存访问错误。
- 输出格式更规范:第一个元素前不会打印多余空格,输出格式更整洁。
如果你后续学习了哈希表、位图这类数据结构,还可以把这个功能的时间复杂度从现在的O(n²)优化到O(n),但对于初学阶段,这种顺向直白的逻辑是最不容易出错、可读性最好的写法。
内容的提问来源于stack exchange,提问作者Alfa Hores
相关产品推荐
相关产品推荐

