为什么我在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++新手。
?:
是一个三元运算符,它采用三个表达式并以某种方式计算它们以产生结果。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
返回。
希望您了解其中的区别,这可以解决您的疑问!
可能的修复:
if (n <= 1) return 1; else return n * f(n - 1);
或
return n <= 1 ? 1 : n * f(n - 1);
请注意,将阶乘实现为递归函数是一种常见的练习。无论如何,由于函数的快速增长,一个int
最多只能容纳12!
,存储预先计算的值可能是一个更好的主意。
相关文章:
- std::is_base_of表示ctor编译错误
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- 如何修复sfml c++代码编译错误
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- vscode下的Arduino代码出现意外编译错误
- 第三方 API 中的编译错误 - Visual Studio
- std::cout输出int时出现编译错误
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 提升图广度优先搜索前置编译错误
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 我在C++中遇到了这个奇怪的编译错误
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 使用 std::enable_if 限制派生类的模板参数时出现编译错误
- 现代OpenGL和GLEW Libraray的编译错误
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- C ++程序编译错误,找不到/访问文件
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- 为什么传递非静态成员函数会导致编译错误?