簡體   English   中英

為什么沒有return語句的main函數返回值12?

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

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