簡體   English   中英

我無法理解 C 程序中的邏輯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM