C 中的复杂比较

Complex Comparison in C

这段代码有什么错误? 这是我遇到的最混乱的代码,请帮我解决这个问题

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

如上所示,代码无法编译,因为 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 标准指定为具有未定义的行为。为 ab.
  • 的所有值定义的 a > b 会更简单、更安全
  • compare(a, b, c)returnsc如果a是最大值,a如果b是最大值,b 如果 c 是最大的... 因此结果在很大程度上取决于给定参数的顺序。有人可能想知道是否打算改为计算三元组的最大值,这不取决于参数的顺序。

我想知道面对这个测试的候选人的真正期望是什么。

为清楚起见,应使用简单的数学规则重写此代码,该规则允许您在 > 的两边添加相同的数字:

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 是三个中的最大值,return c
  • 如果 b 是三个中的最大值,return a
  • 如果 c 是三个中的最大值,return b

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