C++ 除了在C++;

C++ 除了在C++;,c++,error-handling,C++,Error Handling,我最近在一家公司面试实习。他们让我写一个递归函数来计算给定整数的阶乘。所以我在纸上写了这样的东西: int factorial(int n){ if(n<0){throw std::invalid_argument( "received negative value" );} if(n == 0){return 1;} else{ return n * factorial(n-1); } } int阶乘(int n){

我最近在一家公司面试实习。他们让我写一个递归函数来计算给定整数的阶乘。所以我在纸上写了这样的东西:

int factorial(int n){
    if(n<0){throw std::invalid_argument( "received negative value" );}
    if(n == 0){return 1;}
    else{
        return n * factorial(n-1);
    }
}
int阶乘(int n){

if(n检查异常的要求要求调用者捕获并处理异常,使其代码混乱,并给处理异常带来处理开销

还有其他一些方法可以返回而不引发异常

  • 数字的阶乘不能为零或负,因此可以返回0或负整数(即“幻数”)指示阶乘不存在或找不到。类似地,如果输入太大,无法计算
    int
    范围内的阶乘,则也可以返回此无效值,或将特定值设置为指示故障模式的值(例如,0表示输入为负,-1表示输入太大,-2表示任何其他异常)
  • 您可以更改方法签名以返回指向
    int
    的指针,并将逻辑设置为return
    NULL
    以指示无结果(C代码在调用后经典地填充了“检查NULL以确保成功”逻辑)。如果找到阶乘,则返回一个指针,指向保存该值的
    int
    ,该值是使用
    new
    在堆上创建的
  • 您可以接受一个
    short int
    作为输入参数,消除许多(但不是全部)因阶乘太大而无法适应返回值的输入值。这不会完全解决问题,但每一点都有帮助。结合另一种方法,您可以进一步减少潜在的故障模式
上面的第一个选项可能很优雅,因为它允许调用者以多种方式使用该值(例如,打印它,在进一步的数学操作中使用它)不吃一些不算数字或没有数字处理的东西。缺点是你可以用一个没有意义的数字。在某些情况下,输出“楼层数:1,成本:1美元”比在一个重要的演示中崩溃更合适。(在业务规则方面无效,但可以处理数据,在这种情况下是指针)在超级马里奥兄弟中产生了著名的负世界错误


最后一个值更为优雅,因为它有助于防止无效数据进入函数。正如他们所说,垃圾输入,垃圾输出。

那么被指向的
int
究竟在哪里?在多线程程序中如何工作?您确定这是这里唯一的错误条件吗(提示,事实并非如此,至少还有一个明显的原因)?@SamVarshavchik我回答了。在基本的面试环境中,这些是最明显的答案。当然你可以找到更多的答案。还要记住,OP说这是实习。这不是uber大师的机会。让输入参数不签名实际上并不能阻止无效值进入函数。实际上,这并不意味着在运行时无法从函数中检测。完全有可能将负值传递给无符号参数,它将自动转换为相应的(但不同的)值无符号值。这意味着调用代码在调用函数之前必须预先检查该值。@RobertColumbia感谢您的回答。事实上,当我第一次编写代码时,我只返回-1作为负输入。后来根据他们的问题,我将其改为引发异常!第二个和第三个选项对我来说是新的,可能是这就是他们想要的。谢谢大家!