我必须编写一个函数来获得四个数字中最大的一个。我找到了两种方法 -
#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编程,所以在我前进的过程中了解这一点会很好。谢谢。
答案 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'
}