2015-05-04 183 views
0
#include<stdio.h> 
int GetPositiveInt(void); 

int main(void) 
{ 
    int num = GetPositiveInt(); 
    printf("%d",num); 
    return 0; 
} 

int GetPositiveInt(void) 
{ 
    int n; 
    do 
    { 
     printf("Enter a positive number : "); 
     scanf("%d",&n); 
    }while(n<=0); 

} 

輸出是n的價值,但我不知道它是怎麼回到num該輸出。 scanf()printf()是否影響return函數的值?請解釋一下代碼

如果我添加一條語句,如printf("%d",7); while後輸出爲71,不知道如何1來。

This is我的輸出。這僅供參考。根據要求

文字: -

USR @ USR:〜/ C_programs $ GCC -std = C99 return.c -o返回

USR @ USR:〜/ C_programs $ ./return

輸入一個正數:45

45usr @ USR:〜/ C_programs $ ./return

輸入一個正數:89

89usr @ USR:〜/ C_programs $

+0

你發佈的代碼甚至沒有編譯。在函數'GetPositiveInt()'(第2行)和'while'行之後的'return n;'語句聲明後需要分號。 – axiac

+0

對不起,在申報中。但是對於回報n;部分,我最初的問題是,即使沒有使用return語句,我也在'num'中得到了'n'的值。此代碼的輸出打印出的值,n'我爲我輸入的 –

+0

我看不到圖像你的o/p。請以文字形式發佈。 –

回答

3

以下功能:

int GetPositiveInt(void) 
{ 
    int n; 
    do 
    { 
    printf("Enter a positive number : "); 
    scanf("%d",&n); 
    }while(n<=0); 

} 

功能有望returnint值,而沒有return聲明。您可能想要返回n的值。

return n; 

像這樣::這可以通過添加適當的return語句來實現

int GetPositiveInt(void) 
{ 
    int n; 
    do 
    { 
    printf("Enter a positive number : "); 
    scanf("%d",&n); 
    }while(n<=0); 

    return n; 
} 
+1

恕我直言,最後一點不是必需的。這完全是可選的。 –

+0

主要應該返回0,如果沒有指定值我想,但爲什麼我的代碼工作,即使沒有返回n;即使沒有返回語句,GetPositiveInt()返回'n'的值 –

+0

它不返回,它們是垃圾值。而關於主力,是的,你是對的,雖然這是常見的做法。 –

4

TL; DR你的代碼產生undeifined行爲。

您在GetPositiveInt()函數中缺少return聲明。如果沒有明確的return語句返回一個值,那麼在調用函數中收集函數調用的返回值,並使用它返回undefined behaviour

價:依照C11標準文檔,章§6.9.1,

如果終止的函數}達到,和函數調用的值用於由呼叫者,行爲未定義。


FWIW,只有在main()情況下,除了return說法是不是強制性。從相同的文檔,章節5.1.2.2.3,爲main()功能

達到終止的主要功能}返回0

2

不知道「1」是怎麼來的值。

因爲你沒有在你的方法GetPositiveInt返回任何東西 - 而且這種行爲是未定義:

int GetPositiveInt(void) 
{ 
    int n; 
    do 
    { 
     printf("Enter a positive number : "); 
     scanf("%d",&n); 
    }while(n<=0); 

    return n; //<---Add this line 

} 

C99 6.9.1/12 「函數定義」 雲:

如果}終止一個函數,調用者使用該函數調用的值,該行爲是未定義的。

0

這是不確定的行爲的情況下,因爲你缺少返回statement.however我可以解釋爲什麼1未來。

printf函數返回由it.For例如印刷

printf("%d",printf("%d",7)); 

第一個printf打印7中的字符數,並返回作爲1打印的字符數量。所以輸出是71.

+0

OP從來沒有使用'printf(「%d」,printf(「%d」,7));' –

+0

@Cool Guy我從來沒有這麼說過,我只寫過這個解釋,printf返回打印的字符數 –

+0

是的,請仔細閱讀這個問題。 –

1

它爲我打印0

正如在其他答案中所解釋的那樣,聲明返回某個函數的return語句缺少由編譯器用警告發出,但生成的代碼暴露了未定義的行爲。這意味着該函數可以返回任何值,編譯器不能保證任何有關它的信息。

您可以將函數返回的值視爲該函數的隱藏局部變量。由於缺少return語句,因此隱藏變量未初始化,其值是調用該函數時垃圾數據碰巧存儲在內存中的值。

在實踐中,return語句被翻譯成處理器指令複製返回值到通用處理器的註冊表中的一個(通常在x86%eax)。調用函數(代碼中的main())從該寄存器獲取值並使用它。

因爲你的函數GetPositiveInt()不包含return聲明,編譯器跳過生成放入%eax正確的值的指令和函數執行完畢在%eax讓任何值正好是那裏作爲早期處理的結果。