函数在C中获得最少三个或更多参数

seb*_*seb -1 c math.h minimum

在里面 在C/C++中,函数fmin(x,y)返回两个参数x和y的最小值,如C++参考中所述.

但是,是否有类似的函数fminimum(a,b,c,... x,y,z)可用于查找相同数据类型的三个或更多个参数的最小值?

编辑:抱歉混淆.这个问题仅限于C,所以没有C++

jua*_*nza 9

注意:该问题最初标记为C++.原始答案仅适用于C++,但我提供了遵循相同原则的C解决方案.

我们的想法是将表示开始的一对指针和一个超出范围结束的指针传递给函数,并返回指向最小元素的指针.

int* min_element(int *start, int *end)
{
    if (start == end) return end;

    int *min = start++;
    for (; start != end; ++start)
        if (*start < *min) min = start;

    return min;
}
Run Code Online (Sandbox Code Playgroud)

用法:

int data[] = {1, 5, 3, 66, 4, 81, 23, 2, 6};
int * min = min_element(data, data + 9);
if (min != data + 9)
{
  // range was not empty, min value is *min
}
Run Code Online (Sandbox Code Playgroud)

原始C++答案std::min_element一个迭代器,它给出了一对迭代器指定范围内的最小元素的迭代器.

int arr[] = { 3,1,6,8,9,34,17,4,8};
auto it = std::min_element(std::begin(arr), std::end(arr));
Run Code Online (Sandbox Code Playgroud)

编辑2:从删除的答案中,C++ 11有一个std::min过载,需要一个initializer_list,所以你可以说

auto minval = std::min({a, b, c, x, y, z});
Run Code Online (Sandbox Code Playgroud)

其中a,b,c等都是一种类型的配套operator<.


lur*_*ker 5

老式的方式......

int arr[] = { 1, 3, 6, 100, 50, 72 };

int min_array( int arr[], int len )
{
    int min = arr[0];

    for ( int i = 1; i < len; i++ )
        if ( arr[i] < min )
            min = arr[i];

    return min;
}
Run Code Online (Sandbox Code Playgroud)