[英]Printf return value without return statement
在3個不同的系統上進行了嘗試:CentOS,Ubuntu和Windows(MinGW); 所以我不認為這是異常現象(未定義的行為)
int hello(void)
{
(void)printf("HELLO WORLD\n");
}
int main(void)
{
printf("%d\n",hello());
return 0;
}
輸出為:
你好,世界
12
即使使用不同的文本,它也會返回正確的值。 有什么解釋嗎?
是的,這是 未定義的行為 。
如果結束}
達到,沒有return
,使用返回的值是UB。
在C11
,第§6.9.1章, 函數定義
如果到達終止函數的
}
,並且調用者使用了函數調用的值,則該行為未定義。
您不應真正嘗試通過查看UB的結果來判斷 UB。 畢竟,它是undefined 。
構建代碼時,您可能會收到警告:
warning: no return statement in function returning non-void [-Wreturn-type]
在功能上
int hello(void)
{
(void)printf("HELLO WORLD\n");
}
因為沒有return
聲明。 這就是為什么您會得到未定義的行為
盡管每個人都指出整個業務都是不確定的行為,但只有一個人回答了實際問題。 但是,那里的問題更加錯誤,由於某種原因,沒有人解決。
在3個不同的系統上進行了嘗試:CentOS,Ubuntu和Windows(MinGW); 所以我不認為這是異常現象(未定義的行為)
這種推理存在嚴重缺陷(您所測試的系統數量無法告訴您是否已定義)。 不僅如此,您的測試顯然是膚淺的。 在我的系統上,使用-O2編譯代碼突然使它打印為0,並且可能在您的系統上發生同樣的事情。
它可能偶然起作用的原因是,在您的系統上,返回值保留在EAX中,返回到main()之后並沒有被修改,並且編譯器發出了將值從EAX移至另一個printf的第一個參數的代碼。
如前所述,並顯示了-O2失敗,因此不能依靠它。
最后是一個更錯誤的句子:
即使使用不同的文本,它也會返回正確的值。 有什么解釋嗎?
什么?
讓我們看一下有問題的函數:
int hello(void)
{
(void)printf("HELLO WORLD\n");
}
該函數沒有return語句,因此無論得到什么結果都不是“正確的值”。 特別是,您沒有要求語言返回printf返回的值。 碰巧的是,在您的測試中,您獲得了printf返回的值,但這不是您要的,因此從任何意義上說,它都不是“正確的”。 嚴格來講,人們可能想知道在這種情況下是否可以保證返回最后調用的函數的返回值,但是對此進行了解釋並說明沒有。
12恰好是第一個printf的返回值。 可能是printf("HELLO WORLD\\n");
將保留在EAX
寄存器上。
因此,當第二個printf期望返回值時,它是函數( EAX
)的最后一個返回值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.