如何在 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;
}

解决方法

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

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,28);

或者,由于这仍然非常重复,将这些硬编码的值移动到数组中并编写一个循环:

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

(我猜 min 总是 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

,

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

#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))))

因此,对于您一月的示例:

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