如何在 C 中限制(钳制)结构值

how to limit(clamp) struct values in C

我想找到一种有效的方法来限制结构中成员的值。到目前为止,我正在用“if-esle if”一一检查所有成员的最小最大值

if(months.January>31)
{
January=31
}
else if(months.January<1)
{
January=1;
}
if(months.February>28)
{
February=28
}
else if(months.February<1)
{
February=1;
}

我能想到的唯一比您遵循的方法更有效的方法是使用 ternary operators 而不是 if-else if 语句。像这样:

January = (months.January > 31) ? 31 : months.January;
January = (months.January < 1) ? 1 : months.January;
February = (months.February > 28) ? 28 : months.February;
February = (months.February < 1) ? 1 : months.February;

如果您还不知道什么是三元运算符,这里有一个article on Wikipedia

如果您要重复执行相同操作的代码,请将其放入函数中:

int clamp(int val, int min, int max)
{
  if (val < min) return min;
  if (val > max) return max;
  return val;
}

然后写

months.January = clamp(months.January, 1, 31);
months.February = clamp(months.February, 1, 28);

或者,因为这仍然是相当重复的,将这些硬编码值移动到数组中并编写一个循环:

for (int i = 0; i < NumMonths; ++i)
{
    month[i] = clamp(month[i], month_min[i], month_max[i]);
}

(我猜 min 永远是 1,所以可能没有必要为此使用数组。不过,你明白了)。

这些是我一直使用的一些宏,用于最小值、最大值和钳位。

#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
#define CLAMP(x, lower, upper) (MIN((upper), MAX((x), (lower))))

因此,对于您 1 月份的示例:

months.January = CLAMP(months.January, 1, 31);