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