问题描述
我想找到一种有效的方法来限制结构中成员的值。到目前为止,我正在用“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)