在编程中,模数有助于使数字保持在不超过上限的范围内。
例如:
int value = 0;
for (int x=0; x<100; x++)
cout << value++%8 << " "; //Keeps number in range 0-7
输出:
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7...
现在考虑一下这种情况:
int value = 5;
for (int x=0; x<100; x++)
cout << value-- << " ";
输出:5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7...
我的问题是:如何使用任何条件语句(如if或switch case)将下限限制为0 WITHOUT ?
我想要的输出:5 4 3 2 1 0 0 0 0 0 0 0 ...
答案 0 :(得分:4)
std::max
怎么样?
int value = 5;
for (int x=0; x<100; x++) {
cout << value << " ";
value = std::max(0, --value);
}
答案 1 :(得分:1)
使用std::max(value,0)
或三元运算符。两者都将编译为没有条件跳转的代码。
答案 2 :(得分:1)
也许可以用
完成typedef unsigned u32b;
u32b sat_subu32b(u32b x, u32b y)
{
u32b res = x - y;
res &= -(res <= x);
return res;
}
取自here。更具体地说,它似乎实现了饱和减法;饱和的减量将是
u32b sat_dec(u32bx)
{
u32b res = x-1;
res &= -(res <= x);
return res;
}
似乎没有分支。
答案 3 :(得分:0)
这两种情况不同。如您所示,%
会使数字从0
循环到7
,而在否定的情况下,您似乎要求max
根据您是否将三元运算符视为条件运算符,您可以执行以下操作:
int value = 5;
for (int x=0; x<100; x++)
cout << value > 0 ? value-- : 0 << " ";
这会产生副作用,value
一旦达到0
就不会再减少。
或者,您可以使用std::max
:
int value = 5;
for (int x=0; x<100; x++)
cout << std::max(0, value--) << " ";
答案 4 :(得分:0)
在max
中使用std
功能
max
function detail:
template <class T> const T& max (const T& a, const T& b) {
return (a<b)?b:a;
}