为什么在 C++ 阶乘函数中出现编译错误?

Why am I getting a compilation error in a C++ factorial function?

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

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

它说 Expected ':' to match this '?' 我是 C++ 的新手。

可能的修复:

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

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

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

?: 是一个 三元运算符 ,它采用三个表达式并以某种方式计算它们以产生结果。 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 <= 1) ? 1 : n * factorial(n-1) ); 时,三元运算符将首先被计算 并且它会给出一个值(这就是为什么 三元运算符 中的表达式需要根据满足的条件求值 ) 并且该值最终由 return.

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