我们说我有一个功能:
int AndTwoNum(int N, int M, int i)
{
if ((i < 0) || (i > 31))
{
return //what should I return here?
}
int mask = ~0 << i;
int N_modify = N & mask;
int M_modify = M & (~mask);
return N_modify | M_modify;
}
该函数用0的0到i位替换N的0到i位并返回该值。但是在这里我们必须检查i是否在范围[0,31]内。如果不是,我们需要立即停止该功能。但是,我不知道该为了一个意想不到的人而回到这里。
答案 0 :(得分:4)
如果输入无效,选项可能只是抛出异常,例如
#include <stdexcept> // For std::invalid_argument
...
int AndTwoNum(int N, int M, int i)
{
// Check 'i' range.
if ((i < 0) || (i > 31))
{
throw std::invalid_argument("'i' is out of valid range (0-31).");
}
...
答案 1 :(得分:0)
如果要在错误上返回一个整数:对于错误返回的内容没有硬编码规则。有些函数返回(-1),因为这是富有表现力的,但其他函数返回(0)。重要的是这个值必须超出可能结果的范围,否则你怎么知道这实际上是一个错误?在你的情况下(-1)听起来很合理,因为这超出了可能结果的范围。
int AndTwoNum(int N, int M, int i)
{
if ((i < 0) || (i > 31))
{
return (-1);
}
//...
在 C ++ 中,您也可以抛出异常。
#include <stdexcept>
int AndTwoNum(int N, int M, int i)
{
if ((i < 0) || (i > 31))
{
throw std::invalid_argument("argument out of domain");
}
//...
请务必向用户说明行为,并提供正确的说明。
答案 2 :(得分:0)
我更喜欢使用std::optional
来处理这样的情况:
#include <optional>
std::optional<int> AndTwoNum(int N, int M, int i)
{
if ((i < 0) || (i > 31))
{
return std::optional<int>(); // I got nothing for ya
}
int mask = ~0 << i;
int N_modify = N & mask;
int M_modify = M & (~mask);
return std::optional<int>(N_modify | M_modify);
}
然后使用它:
auto n = AndTwoNum(...);
if (n) { // we got a value
int i = *n; // unpack the value
} else {
// no value
}
坏消息是,std::optional
不是当前(C ++ 11)标准的一部分。据我所知,它将成为C ++ 14的一部分。所以编译器支持是不稳定的。您也可以在过渡期间使用Boost.Optional,这是std::optional
所依据的。
另一种方法是返回std::pair<int, bool>
,其中bool
部分用于指示int是否具有有效值。这基本上是std::optional
的作用,但界面更清晰。