为啥我在 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 <= 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++时为啥有错误也没有下划波浪线?