C 语言中的 MIN 和 MAX 函数

Ammar Ali 2023年10月12日
C 语言中的 MIN 和 MAX 函数

本教程将讨论使用宏或循环在 C 语言中实现 MINMAX 函数。

C 语言中的 MINMAX 函数

MINMAX 函数用于从两个值中找到最小和最大数,并且在 C 语言中未预定义。如果我们想使用 MINMAX 函数,我们必须在 C 语言中定义它们。

我们可以使用宏来定义 C 语言中的 MINMAX 函数。宏是用于定义变量值和函数的代码段。

当我们调用宏时,它会被它的值或函数替换。例如,我们可以定义像 PI 这样的变量的值,当我们在代码中使用名称 PI 时,名称将被其值替换。

我们也可以将宏定义为一个函数,如果我们在代码中写下它的名字就会被调用。我们使用 #define 关键字在 C 语言中定义宏。

例如,让我们使用 C 语言宏定义 MINMAX 函数。请参阅下面的代码。

#include <stdio.h>
#define MIN(i, j) (((i) < (j)) ? (i) : (j))
#define MAX(i, j) (((i) > (j)) ? (i) : (j))
int main() {
  printf("Min = %d\n", MIN(0, 10));
  printf("Max = %d", MAX(0, 10));
  return 0;
}

输出:

Min = 0
Max = 10

在上面的代码中,? symbol 是三元运算符,用于代替 if-else 语句。如果三元运算符之前的条件为真,则输出将等于冒号:的左侧,如果条件为假,则输出将等于冒号:的右侧。

在上面的代码中,我们使用了括号,因为输入也可以是诸如 a+b 这样的表达式,如果我们不使用括号,输出会发生变化。我们也可以使用 if-else 语句代替三元运算符。

上面的代码会在我们在函数内部传递表达式的双重评估副作用的情况下产生问题。我们可以使用 __typeof__ 命令来定义 MINMAX 函数来避免上述问题,给我们更多的安全和更少的错误。

__typeof__ 命令指的是表达式的类型。我们可以使用带有表达式和类型的 typeof 命令。

例如,让我们使用 __typeof__ 命令定义上述 MINMAX 函数。请参阅下面的代码。

#include <stdio.h>
#define MAX(x, y)       \
  ({                    \
    typeof(x) _x = (x); \
    typeof(y) _y = (y); \
    _x > _y ? _x : _y;  \
  })

#define MIN(x, y)       \
  ({                    \
    typeof(x) _x = (x); \
    typeof(y) _y = (y); \
    _x < _y ? _x : _y;  \
  })
int main() {
  printf("Min = %d\n", MIN(0, 10));
  printf("Max = %d", MAX(0, 10));
  return 0;
}

输出:

Min = 0
Max = 10

在上面的代码中,我们使用 __typeof__ 命令来引用输入的类型,然后我们使用三元运算符来定义 if-else 语句。我们可以看到输出与前面的示例相同。

上面的代码可以避免双重评估问题,因为上面的宏只会评估一次参数。上述方法仅适用于两个整数输入的情况。

如果我们想找到数字数组中存在的最小和最大数字,我们不能使用上述方法,因为在上述方法中,我们只比较两个数字。在数组的情况下,我们必须将所有元素一起比较以找到数组中存在的最小值或最大值。

我们可以将数组的第一个元素存储在一个变量中,然后我们可以使用循环将该元素与数组的其他元素进行比较。

在最大数的情况下,如果下一个元素大于数组中存在的下一个元素,则表示保存的元素不是数组中存在的最大元素,我们将保存的元素替换为下一个元素,我们将重复此过程,直到将保存的元素与数组中存在的所有元素进行比较。

在最小数量的情况下,只有当下一个元素小于保存的元素时,我们才会用下一个元素替换保存的元素,并且我们将重复此过程,直到将保存的元素与数组中存在的所有元素进行比较。

#include <stdio.h>

int MAX(int My_array[], int len);
int MIN(int My_array[], int len);
int main() {
  int My_array[] = {6, 3, 15, 9, 10, 50, 99, 11};
  int len = sizeof(My_array) / sizeof(My_array[0]);
  int numMax = MAX(My_array, len);
  int numMin = MIN(My_array, len);
  printf("Max number = %d\n", numMax);
  printf("Min number = %d", numMin);
  return 0;
}

int MAX(int My_array[], int len) {
  int num = My_array[0];
  for (int i = 1; i < len; i++) {
    if (My_array[i] > num) {
      num = My_array[i];
    }
  }
  return num;
}

int MIN(int My_array[], int len) {
  int num = My_array[0];
  for (int i = 1; i < len; i++) {
    if (My_array[i] < num) {
      num = My_array[i];
    }
  }
  return num;
}

输出:

Max number = 99
Min number = 3

在上面的代码中,我们创建了两个函数,MAX()MIN(),它们有两个输入参数。第一个参数是给定的数组,第二个是数组的长度。

我们使用 sizeof() 函数找到整个数组的大小,然后将其除以数组第一个元素的大小,得到给定数组的长度。

MAX()MIN() 函数中,我们将数组的第一个元素存储在一个变量中,然后我们使用循环将它与数组的所有其他元素进行比较,当整数 i 等于数组的长度,这意味着循环已到达数组的末尾。

在循环内部,我们使用 if 语句将数组的下一个元素与我们保存的值进行比较,如果下一个元素大于在 MAX() 的情况下保存的元素,我们将替换它的值函数,在 MIN() 函数中,如果下一个元素小于保存的元素,我们将替换该值。我们使用 printf() 函数来打印 MIN()MAX() 函数返回的值。

上面的代码仅适用于整数数据类型的数组,但我们也可以更改上面的代码以在其他数据类型(如 float)的情况下找到最小和最大数字。在上面的代码中,如果是 float 数据类型的数组,我们必须将 int 数据类型更改为 float

比如数组的数据类型会变成 float,用来存储数组第一个元素的变量的数据类型也会变成 float,长度的数据类型会保持不变。

作者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

相关文章 - C Function