C语言——关于简单代码的优化问题

C语言——关于代码的简单优化问题

概述

最近在整理c语言的东西的时候,翻到了自己刚接触计算机语言时写的代码。也是深有感触。在一开始写代码的时候自己是只追求不报错。甚至对很多关键词的理解都不到位。所以写代码的时候也仅仅只是做到了不报错而已。
这样的代码其实是很不好的,无论是运行效率和代码可读性而言都是很差的。举一个很简单的例子。这是我刚开始接触c语言时的代码,找两个数中的较大值。

int max(int a, int b)
{
    int c;
    if (a < b)
    {
        c = b;
    }
    else
    {
        c = a;
    }
    return c;
}

实际上,这样的代码其实并没有错,但是并不好,max使用了一个c的额外空间, 而且代码显得很冗长。我们可以修改为

int max(int a, int b)
{
    if (a < b)
        return b;
    else
        return a;
}

这样做的好处是不需要使用第三个额外变量c,同时不需要跑额外的赋值语句。代码也显得更为简单,我们甚至可以将代码修改为一行。

int max(int a, int b)
{
    return a > b ? a : b;
}

这样相比第一个函数就显得更加精炼,可读性也会更好。

寻找数组中的单身狗

这样的例子其实有很多。这也是代码的魅力所在。同样的问题我们可以考虑很多不同的算法,从所有的算法中找出一个更优秀的解法来实现我们的目的。“寻找数组中的单身狗”也是我曾经写过的一个小函数。

int main()
{
    int n = 9;
    int flag;
    int a[9] = {1,2,4,5,8,5,4,2,1 };
    int b;
    for(int i=0;i<n;i++)
        for (int j = 0; j < n - i - 1; j++)
        {
            if (a[j] > a[j + 1])
            {
                flag = a[j];
                a[j] = a[j + 1];
                a[j + 1] = flag;
            }
        }
    for(int i=0;i<n;)
    {
        if (a[i] == a[i + 1])
            i += 2;
        else
            b = a[i];
    }
}

实现逻辑很简单,就是先排序,然后比较相邻的两个数,如果一样就比较下两个数,如果不一样就将这个数取出来。很显然,这也是没有错的,但是却很繁琐。我们可以通过异或^运算来简化代码。

int main()
{
    int n = 9;
    int flag;
    int a[9] = {1,2,4,5,8,5,4,2,1 };
    int b=0;
    for (int i; i < n; i++)
        b ^= a[i];
    printf("%d\n",b);
}

显然这样的代码就显得更加简单,效率更高,可读性更好。相同的两个数异或为0;别的数异或0等于其本身。

总结

合理的算法会让问题的实现变得更加简单,代码的效率更高,或是可读性更好。这也能显示出敲代码的能力和个人的思维逻辑。写这篇博客是为了提醒自己要学会在写完代码后试着寻找是否有更为优秀的解决方案。同时如果有刚进入计算机领域的同学,也请你更加注意自己代码的算法方案,不要只追求正确运行。这很有利于提升自己的思考的缜密和逻辑能力。也会让你更快进步。
当然,并不是所有的优化都会提高效率的同时让可读性也变得很好。例如函数递归就是牺牲效率的算法。递归让时间空间的消耗都变得很大。但是他让代码变得十分简洁清晰。这在我们解决一些重复调用的问题时,变得更加简单。当然,具体的算法选择需要对应相应的情况。这篇博客仅为了提醒自己,在写代码时,多思考实现算法的优劣,不要只在意是否实现。

你可能感兴趣的:(学习总结,c,编程语言)