[英]I cant understand the logic in my C program
#include <stdio.h>
int factorial(int value){
if(value == 0){
value * factorial(value - 1);
}
}
int main()
{
int value = 0;
printf("The factorial of %d of %d",value, factorial(value));
}
我有一個 output
The factorial of 0 is -1
誰能解釋我為什么得到-1???
我試圖觀看一些關於此的視頻,但我沒有得到答案
如果可能的話,解釋一下這個邏輯?
謝謝
factorial
有幾個問題:它從不返回任何東西,並且當0
傳遞給它時它會遞歸(這應該是基本情況,應該返回1
)。 嘗試這個:
int factorial(int value) {
if (value == 0) {
return 1;
}
return value * factorial(value - 1);
}
誰能解釋我為什么得到-1???
這是未定義的行為,但可能的答案是編譯器使用相同的寄存器
.text
.globl factorial
.type factorial, @function
factorial:
.LFB0:
.cfi_startproc
pushq %rbp #
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp #,
.cfi_def_cfa_register 6
subq $16, %rsp #,
movl %edi, -4(%rbp) # value, value
# fact.c:14: if(value == 0) value *factorial (value - 1); so if value != 0 execute these 2 lines
cmpl $0, -4(%rbp) #, value
jne .L2 #, jump to L2 if not equal to 0
# fact.c:14: if(value == 0) value *fact (value -1); execute next 4 lines if value == 0
movl -4(%rbp), %eax # value, tmp90
subl $1, %eax #, _1
movl %eax, %edi # _1,
call factorial #
.L2:
# fact.c:17: }
nop
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
因此寄存器eax
用於返回值,因此如果您查看此程序集片段:
movl -4(%rbp), %eax # value, tmp90
subl $1, %eax #, _1
movl %eax, %edi # _1,
call factorial #
您會看到該value
已移入%eax
,然后減去1
並再次調用factorial
,在這種情況下,它的value
不是0
,因此它將退出。
EAX:累加器。 該寄存器通常存儲函數的返回值。
從這個頁面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.