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

Posted

技术标签:

【中文标题】为啥我在 C++ 阶乘函数中出现编译错误?【英文标题】: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 是的,刚刚意识到并改变了它。 【参考方案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 的解释也添加到答案中。

以上是关于为啥我在 C++ 阶乘函数中出现编译错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在使用 SDL2 的 C++ 中出现“无匹配令牌错误”?

当我在 borland c++ 中编译程序时,出现“无法打开包含文件 'owl/owlpch.h'”错误

Visual Studio 2010在编译c++时为啥有错误也没有下划波浪线?

为啥在尝试定义函数体时会出现此编译器错误?

Visual Studio 2010在编译c++时为啥有错误也没有下划波浪线?

为啥在尝试调用采用动态参数的基本构造函数/方法时会出现此编译错误?