2013-11-15 58 views
2

考慮下面的代碼:return;這個聲明返回什麼?

#include <stdio.h> 

int main() 
{ 
    int a ; 
    a = message() ; 
    printf("--%d",a); 
} 

message() 
{ 
    printf("--%d",printf ("\nViruses are written in C")); 
    return ; 
} 

我得到輸出:(海合會)

病毒是寫在C - 25--4

我的解釋:return ;語句返回累加器中的值,最新的printf返回的值存儲在累加器中... 這是正確與否?

+0

你的解釋是錯誤的。在C中沒有「累加器」,標準也不允許空的「返回」返回任何有用的東西。編譯錯誤將顯示它是無效的代碼,並且您得到的效果是未定義行爲。 – usr2564301

+1

@Jongware:用「Intel 32位」上的''eax'替換爲「累加器」,並添加關於未定義行爲的警告,對於OP所使用的編譯器來說,解釋是非常正確的。 – RichieHindle

+0

@RichieHindle:既不是'eax'也不是'Intel'是C標準的一部分(*它們中的任何*,因爲有一對夫婦)。 – usr2564301

回答

0

它什麼也沒有返回。它只會終止你的功能。但是由於你的函數在C89中沒有返回類型,它的返回類型隱含地轉換爲int,但它在C99和後者中不合法,並且這將調用未定義的行爲

如果非void函數達到其主體的端部 - 即,它失敗時執行return statement-- 程序的行爲是未定義的,如果它試圖使用該函數的返回值

一些編譯器會發出警告:

control reaches end of non-void function 
3

行爲是不確定的。

你所看到的4的原因是,你的代碼發生不寫,打印在message--%dprintf之間使用(在32位英特爾eax如。)返回從函數值寄存器(它印四個字符--25)和main中的最終printf

1

你正在調用undefined behavior通過返回值返回函數沒有任何回報。如果我們看一下draft C99 standard部分6.8.6.4return語句說:

[...]不帶表達式的return語句只能出現在一個函數 其返回類型爲void。

你真的應該對這個應該怎麼運行沒有預期,但你可以做一些很好的猜測,Deep C呈現幾個部分展示了,但我永遠不會做任何這在生產環境中。

如果你有啓用了警告,你應該已經看到了一些信息的消息,例如gcc提供了以下警告:

warning: implicit declaration of function ‘message’ [-Wimplicit-function-declaration] 
warning: return type defaults to ‘int’ [enabled by default] 
warning: ‘return’ with no value, in function returning non-void [enabled by default] 

您還依賴隱式的返回類型,因爲C99不再被允許的,但編譯器像gcc即使在C99模式下也支持它們。所以如果是這種情況,則message將有一個int隱式返回類型。

+0

感謝您獲得Deep C幻燈片的鏈接 - 非常有趣! – RichieHindle