[英]Why does a main function without a return statement return value 12?
我寫了一個打印表格的程序。 我沒有在main函數中包含返回語法,但每當我輸入echo $時仍然如此? 它顯示12。
我的源代碼:
#include <stdio.h>
int main(void)
{
int ans,i,n;
printf("enter the no. : ");
scanf("%d",&n);
for(i=1;i<=10;i++)
{
ans = n*i;
printf("%d * %d = %d\n",n,i,ans);
}
}
我沒有寫回12,但每次執行程序時它仍返回12。
謝謝。
正如swegi所說,這是未定義的行為。
正如Steve Jessop等人所說,它是一個未指定的值,直到C89,並在C99中指定(觀察到的行為不符合C99)
在大多數環境中實際發生的事情是,最后一個printf
的返回值保留在用於返回值的寄存器中。
因此,對於n == 0,它將為11,如果n是一位數,則為12,對於兩位數n為14,對於三位數n為16,等等。
回答是因為所有現有的答案都說它是未定義的行為,這是不正確的,所以我沒有任何東西可以投票。
在C89中(感謝pmg參考標准草案 ),5.1.2.2.3:
從初始調用到main函數的返回等效於使用main函數返回的值作為其參數調用exit函數。 如果到達終止主函數的},則未指定返回到主機環境的終止狀態。
在C99中,引用自n1256,5.1.2.2.3:
如果main函數的返回類型是與int兼容的類型,則從初始調用返回main函數等效於調用exit函數,其中main函數返回的值作為其參數; 到達終止main函數的}返回值0.如果返回類型與int不兼容,則返回到主機環境的終止狀態未指定。
因此,它不是“未定義的行為”:它的行為就像main
函數返回一樣,但在C89中,返回的值不是由標准指定的。 對於您的示例程序,在您的實現中,返回的值似乎始終為12,可能是因為Ben Voigt說。 因為你使用的是Linux,所以將代碼編譯成C99可能不是一個很大的改變(或者無論如何,使用gcc幾乎兼容的C99模式編譯它)。
對於除main
之外的任何返回值的函數,它是未定義的行為, 除非調用者不使用返回值(n1256,6.9.1 / 12):
如果到達終止函數的},並且調用者使用函數調用的值,則行為是未定義的。
我不確定是否應該提及對main
的初始調用被排除在此一般規則之外。 它不需要:從標准的POV,該調用沒有調用者,所以我認為函數調用的值不是“調用者使用”,即使它成為終止狀態對於該計划。
如果您完全熟悉匯編語言,您可能會記得函數的“返回值”是通過EAX寄存器傳遞的。
在這種情況下,正在從EAX讀取返回值。 在這種情況下,恰好是12。
但是,您沒有明確設置此值,它只是來自其余代碼的工件(或者可能只是機會)。
如前所述,這絕對是undefined behavior
。 如果您只是好奇為什么會這樣,請考慮這個解釋。
但是,在任何情況下,都不要試圖故意將這個值用作任何有意義的東西。
你的程序通過不應該返回任何東西而導致未定義的行為,因此調用者通常會抓住eax寄存器的值(在x86上,x64上的rax)在過程返回時,這通常是垃圾最后一次使用eax(通過函數返回值或只是基於寄存器的變量),在這種情況下,它可能是printf寫入stdout緩沖區的char的數量
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.