一尘不染

在不使用条件语句和三元运算符的情况下,在C中找到最多三个数字

algorithm

我必须找到用户提供的最多三个号码,但有一些限制。不允许使用任何条件语句。我尝试使用如下三元运算符。

max=(a>b?a:b)>c?(a>b?a:b):c

但同样其仅限于使用三元运算符。现在我不知道该怎么做?


阅读 266

收藏
2020-07-28

共1个答案

一尘不染

在布尔表达式中利用短路:

int max(int a, int b, int c)
{
     int m = a;
     (m < b) && (m = b); //these are not conditional statements.
     (m < c) && (m = c); //these are just boolean expressions.
     return m;
}

说明:

在布尔AND运算(例如)中x && y当且仅当 x为true时 ,才 评估y
。如果x为false,y则不进行评估,因为整个表达式为false,即使不进行评估也可以得出结论y。当可以推导布尔表达式的值而无需评估其中的所有操作数时,这称为短路。

将此原理应用于上述代码。最初ma。现在,如果 (m < b)为true,则意味着b大于m(实际上是a),因此第二个子表达式 (m = b)被求值并将m其设置为b。但是(m < b),如果为false,则将不评估第二个子表达式m并将保留a(大于b)。以类似的方式,计算第二个表达式(在下一行)。

总之,你可以阅读表达(m < x) && (m = x)如下:设置mx 当且仅当 m小于x(m < x)是如此。希望这可以帮助您理解代码。

测试代码:

int main() {
        printf("%d\n", max(1,2,3));
        printf("%d\n", max(2,3,1));
        printf("%d\n", max(3,1,2));
        return 0;
}

输出:

3
3
3

请注意maxGives警告的实现,因为未使用评估表达式:

prog.c:6:警告:未使用计算值
prog.c:7:警告:未使用计算值

为避免这些(无害)警告,您可以实现max为:

int max(int a, int b, int c)
{
     int m = a;
     (void)((m < b) && (m = b)); //these are not conditional statements.
     (void)((m < c) && (m = c)); //these are just boolean expressions.
     return m;
}

诀窍在于,现在我们将布尔表达式强制转换为void,这会导致警告的抑制

2020-07-28