哪种方法更好 - 更多条件或更多变量?

时间:2018-05-21 11:46:18

标签: c

我必须编写一个函数来获得四个数字中最大的一个。我找到了两种方法 -

#include <stdio.h>                                                        
int main() 
{
    int a, b, c, d;
    int max_of_four(int a, int b, int c, int d);
    scanf("%d %d %d %d", &a, &b, &c, &d);
    int ans = max_of_four(a, b, c, d);
    printf("%d", ans);
    return 0;
}

int max_of_four(int a,int b,int c,int d)
{
    int result,result2,result3;
    if(a>b)
        result=a;
    else
        result=b;
    if(result>c)
        result2=result;
    else
        result2=c;
    if(result2>d)
        result3=result2;
    else
        result3=d;
    return result3;
}

或者我也可以写这样的函数 -

int max_of_four(int a,int b,int c,int d) 
{
    int greatest_int;
    if (a>b && a>c && a>d)
        greatest_int=a;
    else if (b>c && b>d)
        greatest_int=b;
    else if (c>d)
        greatest_int=c;
    else
        greatest_int=d;

    return greatest_int;
}

我可以知道哪个会更好,因为在第一个函数中我使用了更多的变量,在下一个函数中我使用了更多的条件。我试过跑两个&amp;他们花了相同的时间,所以我无法区分这两者。由于我刚开始使用C编程,所以在我前进的过程中了解这一点会很好。谢谢。

3 个答案:

答案 0 :(得分:4)

或者你可以这样写:

int max_of_four(int a,int b,int c,int d) 
{
    int greatest_int = a;
    if (b > greatest_int) {
        greatest_int = b;
    }
    if (c > greatest_int) {
        greatest_int = c;
    }
    if (d > greatest_int) {
        greatest_int = d;
    }
    return greatest_int;
}

或类似的东西......

int max_of_four(int a,int b,int c,int d) 
{
    int greatest_int = a;
    int *iter = (int[]){b, c, d}, *end = iter + 3;
    for (; iter < end; iter ++) {
        if (*iter > greatest_int) {
            greatest_int = *iter;
        }
    }
}

答案 1 :(得分:3)

  

哪种方法更好 - 更多条件或更多变量?

首先,您需要通过更好

来定义您的意思

表现更好吗?

内存使用量减少了吗?

维护是否更好?

通过查看C代码来猜测性能是你不应该做的事情 - 特别是在C新手时。编译器会对你的C代码进行各种优化,因此(几乎)无法预测性能。唯一的解决方案是分析。

同样适用于内存使用 - 即使您定义了一些变量,编译器也可能会优化它们。您必须检查生成的汇编代码才能得到答案。

关于维护 - 几乎在所有情况下,这都是您应该关注的地方。确保您的代码易于理解(以及维护代码)。性能问题排在第二位。

我们来看看这段代码:

int max_of_four(int a,int b,int c,int d)
{
    int result,result2,result3;
    if(a>b)
        result=a;
    else
        result=b;
    if(result>c)
        result2=result;
    else
        result2=c;
    if(result2>d)
        result3=result2;
    else
        result3=d;
    return result3;
}

这里你说你担心变量的数量......

好吧,让我们重写代码 - 让我假装我是编译器。

我注意到的第一件事是初始化result后,变量a不再使用了。那么,当我已经有result可用时,为什么要引入新的变量a。因此,我只需使用result而不是a,而是重写为:

int max_of_four(int a,int b,int c,int d)
{
    int result2,result3;
    if(a>b)
        a=a;
    else
        a=b;
    if(a>c)
        result2=a;
    else
        result2=c;
    if(result2>d)
        result3=result2;
    else
        result3=d;
    return result3;
}

现在第一个if相当奇怪,所以我重写为:

int max_of_four(int a,int b,int c,int d)
{
    int result2,result3;
    if(b >= a) a=b;
    if(a>c)
        result2=a;
    else
        result2=c;
    if(result2>d)
        result3=result2;
    else
        result3=d;
    return result3;
}

我再次注意到,result2初始化后,变量a不再使用了。因此,我可以重复上面的模式,并通过result2替换它来摆脱a。之后,我可以重复相同的模式来摆脱result3,我的代码看起来:

int max_of_four(int a,int b,int c,int d)
{
    if(b >= a) a = b;
    if(c >= a) a = c;
    if(d >= a) a = d;
    return a;
}

还担心变数的数量?

由于编译器可以看到各种变量何时仍在使用(或者不再使用),编译器可以通过重用“死”变量来优化原始代码。

但是......编译器可能会做一些更优化的事情。什么?在我看一下生成的汇编代码之前我不知道。

所以结论是 - 在找到更好的方式时不要看C代码。

答案 2 :(得分:1)

android {
compileSdkVersion 'android-P'

defaultConfig {
    targetSdkVersion 'P'
}