C++ 需要确保值在0-255之间
这可能真的很容易,但我不知道如何“确保”它在这个范围内 因此,基本上我们有C++ 需要确保值在0-255之间,c++,C++,这可能真的很容易,但我不知道如何“确保”它在这个范围内 因此,基本上我们有类Color和许多要从中实现的函数 我需要的这个功能是: 效果:将颜色值更正为0-255(含0-255)范围内。如果值超出此范围,则调整为0或255,以较接近者为准 这就是我到目前为止所做的: static int correctValue(int value) { if(value<0) value=0; if(value>255) value=255; }
类Color
和许多要从中实现的函数
我需要的这个功能是:
效果:将颜色值更正为0-255(含0-255)范围内。如果值超出此范围,则调整为0或255,以较接近者为准
这就是我到目前为止所做的:
static int correctValue(int value)
{
if(value<0)
value=0;
if(value>255)
value=255;
}
static int-correctValue(int-value)
{
如果(值255)
数值=255;
}
对不起,这么简单的问题/ 很公平。但是你错过了最后的回报声明
static int correctValue(int value)
{
if(value<0) return 0;
if(value>255) return 255;
return value;
}
static int-correctValue(int-value)
{
if(value255)返回255;
返回值;
}
只要在ifs之后返回函数底部的值,就可以了。您所拥有的一切都可以正常工作。只需在函数末尾返回值
。如果您想让它更简洁,可以使用三元表达式,但要牺牲一点可读性:
value = (value < MIN) ?
MIN : (value > MAX) ?
MAX : value;
value=(值最大值)?
MAX:值;
其中
MIN
为0,MAX
为255。使用MAX和MIN夹紧非常容易:
value = std::min(255,std::max(0,value))
但是您的方法也应该是正确的。静态int-correctValue(int-value){
static int correctValue(int value) {
int correctedValue;
if (value < 0) {
correctedValue = 0;
} else if (value > 255) {
correctedValue = 255;
} else {
correctedValue = value;
}
return correctedValue;
int校正值;
如果(值<0){
修正值=0;
}否则如果(值>255){
修正值=255;
}否则{
修正值=数值;
}
返回修正值;
}这很好。我建议制作一个
夹具
功能以实现可重用性:
template <typename T>
void clamp(T& pValue, const T& pMin, const T& pMax)
{
pValue = std::min(std::max(pValue, pMin), pMax);
}
template <typename T>
T clamp_copy(T pValue, const T& pMin, const T& pMax)
{
clamp(pValue, pMin, pMax);
return pValue;
}
我同意其他答案,但有一处修改;这应该是一个else-if语句。如果您已经知道该值小于0,则无需测试该值是否超过255
static unsigned char correctValue(int value)
{
if(value<0) value=0;
else if(value>255) value=255;
return value;
}
静态无符号字符值(int值)
{
如果(值255)值=255;
返回值;
}
使用无符号字符,而不是使用int
,该值将无法低于0或高于255。除了您没有返回修改后的值之外,该函数没有任何问题。事实上,它应该是一个else ifFor值,使用无符号整数类型,因为无论如何不能小于0unsigned char
应该是最合适的。或者使用min
和max
将其取回。更具可读性的是将功能包装起来。:]说得好。我对三元表达式进行了总体评论。我使用它们,但有些人似乎不喜欢它们。三元表达式过去通过保存一个术语的求值来提高效率,但在优化编译器的这些日子里,它们是否更像是模糊编码竞争对手的一个工具?:)尽管如此,我还是在简单的情况下使用它们,因为我发现它提高了可读性。@Duncan!哈哈,我知道,对吧?在某些情况下,我发现它们实际上比一堆if-else更好地提高可读性。@Duncan:Ternaries用于初始化带有短表达式的const
对象(对于一些较小的值)。我认为我们应该对他温和一些。他才刚刚开始,让我们不要用泛型蒙蔽他:)@Aran:Meh,这样的函数足够简单,可以作为一个很好的起点请对否决票发表意见?这将是另一个“不要给noobs这么好的工作代码!”的无聊案例吗?否决票不是我的-这是一个好答案,对其他对通用钳形感兴趣的人也会有用。@pax:不,不可能存在两个只在返回类型上不同的函数。这就是为什么一个后缀是\u copy
:)在我看来,这个函数并不十分复杂,应该作为一个非常基本的模板函数。但是该死的那些意见,总是不同的……a)性病……家庭作业太多了,b)为什么看起来不对?(尽管它是正确的)+1尽管对于这样简单的事情,我可能会执行“if(val<0)return 0;”,而不是设置一个返回值。它足够小,多次返回不会影响可读性。无符号字符
可能会高于255。我仍然会返回一个无符号字符
,这样返回类型就可以很明显地表明该值现在包含在[0255]
中。答案更改了。
static unsigned char correctValue(int value)
{
if(value<0) value=0;
else if(value>255) value=255;
return value;
}