You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 08:39:15