在函数调用中递减运算符

时间:2017-12-05 13:39:31

标签: c

我目前正在学习C语言"编程C"作者:Stephen G. Kochan(第3版)。在关于递归函数的章节中,给出了阶乘函数。递归的部分是(test ...),其中result = n * factorial(n - 1);是要计算其阶乘的数字的形式参数,n是函数。出于好奇,我将函数调用更改为factorial,而我的Linter给了我一个警告,说明n上的这个操作可能是未定义的,这会编译并按预期运行(我在Ubuntu上使用gcc)。我无法理解这里发生的事情。根据我的理解,我最终得到的产品为0(0 * 0 * 0 * ... * 1),最后一个值为1。但是这个函数仍然会像factorial(--n)一样返回正确的值。

以下是该函数的完整代码:

factorial(n - 1)

澄清一下:我的问题与未定义的行为无关(为什么这是未定义的行为?),但编译器如何处理这种特殊情况。因为这个问题被标记为重复,所以答案在这里不适用(尽管@badp在duplicate回答了我的问题,但那里不是公认的答案),我将在这里回答。

答案

@StoryTeller提供了一个示例,其中这种编写函数的方式(unsigned long int factorial(unsigned int n) { unsigned long int result; if (n == 0) result = 1; else result = n * factorial(--n); return result; } 可能会导致行为与预期的行为不同。 @Pedram Azad给出了一个例子,说明如何通过检查程序集列表来找出编译器如何处理它。可以通过运行n * factorial(--n)生成包含此代码的文件,其中gcc prog.c -S -o prog.s是包含c代码的文件,prog.c是包含汇编代码的文件。重要的部分是prog.s选项。

0 个答案:

没有答案