我的代码亮度限制为[0..255]。 并且由于某种原因进行了评估,因此我可以获得超出界限的价值。 我能做到
(if x>maxValue) x = maxValue;
或
x = min(x, MaxValue);
或
(x > MaxValue) ? MaxValue : x;
但我想知道什么是好方法?如何通过较少的比较和良好的代码风格来限制值?
答案 0 :(得分:2)
对x使用unsigned char而不是int,chars限制为[0,255]。虽然你必须检查是否有溢出,但这有点棘手。
答案 1 :(得分:1)
如何通过较少的比较和良好的代码风格来限制值?
一个比较最少,任何较小意味着没有比较。如果您需要,请查看Compute minimum without branching。
为了好的风格,这是最好的 -
if (x > maxValue)
{
x = maxValue;
}
答案 2 :(得分:0)
inline long clamp(long x, long min, long max){
return x>max ? max : (x<min ? min : x);
}
你可以编写一个只接受0到255之间值的新类,并且可以隐式地转换为int,但使用clamp或max之类的东西就足够了。
答案 3 :(得分:0)
我猜:
(x > MaxValue) ? MaxValue : x;
相当于:
(if x>maxValue) x = maxValue;
else x = x;
我知道很有可能它会被优化掉,或者停止自我分配等等。所以本质上它与第一个if,只是语法糖涂层相同。
我会使用min
,因为它会提供类型安全性,并有助于避免比较混合类型。
答案 4 :(得分:0)
就良好的编码风格而言,您可以创建自己的类来管理此值绑定要求。如果重载赋值运算符,则可以在那里进行比较。
修改强> 我想你可以将所有代码放在一个函数中。但我认为与类实例进行交互会更好。
BoundedInt x;
x = 300;
x.value(); // x == 255