此代码中有什么错误? 这是我见过的最困惑的代码,请帮我解决这个问题
#include <stdio.h>
int compare(int a, int b, int c){
if(a-b>0&&a-c>0)
return c;
else
if (b-c>0)
return a;//what would it return?
else
return b;
}
int main()
{//below in printf? is it right to print this way?
printf("%d",compare(compare(88,89,91)compare(90,41,17)compare(75,100,96)));
return 0;
}
答案 0 :(得分:1)
发布时,代码无法编译,因为printf
参数列表中缺少逗号。
以下是具有额外间距的更正版本,以提高可读性:
#include <stdio.h>
int compare(int a, int b, int c) {
if (a - b > 0 && a - c > 0)
return c;
else
if (b - c > 0)
return a;//what would it return?
else
return b;
}
int main() {
//below in printf? is it right to print this way?
printf("%d\n", compare(compare(88, 89, 91),
compare(90, 41, 17),
compare(75, 100, 96)));
return 0;
}
除了最初的语法错误之外,这段代码在许多方面似乎都被打破了:
a - b > 0
执行可能溢出的整数减法:已将C签名算术溢出指定为具有未定义的行为。编写为a > b
和a
的所有值定义的b
会更简单,更安全。compare(a, b, c)
如果c
是最大值则返回a
,a
如果b
是最大值,b
如果c
}是最大的......因此结果严重依赖于给定参数的顺序。有人可能想知道是否打算计算三元组的最大值,这不取决于参数的顺序。我想知道面对这次测试的候选人真正期待什么。
答案 1 :(得分:1)
为了清晰起见,应使用简单的数学规则重写此代码,该规则允许您向>
的两边添加相同的数字:
int compare(int a, int b, int c){
if(a > b && a > c)
return c;
else
if (b > c)
return a;
else
return b;
}
现在规则很简单:
a
最多为3,请返回c
b
最多为3,请返回a
c
最多为3,请返回b
这套规则可让您推断出您拥有的所有案例的输出。