【问题标题】:Why am I getting a compilation error in a C++ factorial function?为什么我在 C++ 阶乘函数中出现编译错误?
【发布时间】:2020-09-18 16:52:45
【问题描述】:

我正在尝试使用三元运算符在 C++ 中编写一个简单的阶乘函数。它给出了一个编译错误。

int factorial(int n) {
    (n == 0) ? return 1 : return n * factorial(n-1);
}

上面写着Expected ':' to match this '?' 我是 C++ 新手。

【问题讨论】:

  • 那个?运算符期望表达式作为参数,而不是语句。 if 可以做到这一点。
  • 我怀疑返回 0 是个好主意。
  • @YvesDaoust 是的,刚刚意识到并改变了它。

标签: c++ function recursion conditional-operator


【解决方案1】:

?: 是一个三元运算符,它接受三个表达式并以某种方式计算它们以产生结果。 return 0 在你的情况下不是一个表达式,而是一个语句,所以你的语法不起作用并给出错误。它不能用于需要值的地方。

正确的代码和语法应该如下:

int factorial(int n) {
    return ((n <= 1) ? 1 : n * factorial(n-1) );
}

如果您像这样使用 if-else,您的代码会起作用 -

int factorial(int n) {
    if(n == 0) return 1; else return n * factorial(n-1);
}

if-else 在语义上不同于三元运算符?:。您可以在if-else 中使用语句,而另一方面,在三元运算符的情况下,您必须使用评估为某个值的表达式。

所以,当你使用语句 - return ((n &lt;= 1) ? 1 : n * factorial(n-1) ); 时,三元运算符将首先得到评估,它会给出一个值(这就是为什么 三元运算符需要根据满足的条件计算出一个值),该值最终由return返回。

希望您了解其中的区别,这可以解决您的疑问!

【讨论】:

  • 另外,fact 应该是 factorial 才能使递归起作用。
【解决方案2】:

可能的修复:

if (n <= 1) return 1; else return n * f(n - 1);

return n <= 1 ? 1 : n * f(n - 1);

请注意,将阶乘实现为递归函数是一种常见的练习。无论如何,由于函数的快速增长,int 最多只能容纳12!,存储预先计算的值可能是一个更好的主意。

【讨论】:

  • 此外,fact 应该是 factorial 以使递归起作用,并将 cmets 的解释也添加到答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 2013-08-14
  • 2011-07-20
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
相关资源
最近更新 更多