C中的复杂比较

时间:2018-06-10 11:16:44

标签: c zoho

此代码中有什么错误? 这是我见过的最困惑的代码,请帮我解决这个问题

#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;
}

2 个答案:

答案 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 > ba的所有值定义的b会更简单,更安全。
  • compare(a, b, c)如果c是最大值则返回aa如果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

这套规则可让您推断出您拥有的所有案例的输出。