首先是猜想,主流平臺(tái)上,函數(shù)返回都是通過某個(gè)通用寄存器返回,x86平臺(tái)是eax,arm是r0,所以猜想即使是void返回,如果硬是要得到返回值的話,應(yīng)該是得到返回那一刻該寄存器的值。
創(chuàng)新互聯(lián)公司成都企業(yè)網(wǎng)站建設(shè)服務(wù),提供成都做網(wǎng)站、成都網(wǎng)站建設(shè)網(wǎng)站開發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設(shè)計(jì),自適應(yīng)網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì)師打造企業(yè)風(fēng)格網(wǎng)站,提供周到的售前咨詢和貼心的售后服務(wù)。歡迎咨詢做網(wǎng)站需要多少錢:13518219792
證實(shí):為了證實(shí),需要寫一點(diǎn)代碼,一個(gè)最簡單的void test(){},一個(gè)main(){printf("%d", test())},然而這樣并不行,無法通過編譯,需要使用手段,代碼如下
void?test()
{
return;
}
typedef?int(*F)(void);
int?main()
{
F?f?=?(F)test;
printf("%d\n",?f());
return?0;
}
對,就是把函數(shù)強(qiáng)制轉(zhuǎn)換為返回int再調(diào)用,結(jié)果并不出人意料,是-858993460,這個(gè)數(shù)看起來沒什么意義,不過轉(zhuǎn)成16進(jìn)制就有意義了,它是0xcccccccc,在VS的debug過程中,eax總是被初始化成這個(gè)值,堆棧內(nèi)數(shù)組也是如此,同時(shí)它也是著名的"屯屯屯屯"的來源。
再把test改一下,進(jìn)一步驗(yàn)證,試圖讓它返回0,辦法是把eax變成0:
void?test(){
int?i?=?1;
i--;
return;
}
猜想這次會(huì)輸出0,因?yàn)閕會(huì)放進(jìn)eax里,再進(jìn)行自減運(yùn)算,結(jié)果也得到證實(shí)。
機(jī)器環(huán)境,win10 64bit,IDE,visual studio 2015 社區(qū)版。
希望有所幫助。
這是錯(cuò)誤,既然函數(shù)定義要返回值,就返回一個(gè)值,不返回結(jié)果是未知的 c語言可以允許這樣的代碼,c++視為錯(cuò)誤
這是vc2017結(jié)果:
deubg模式結(jié)果是4,release結(jié)果是0, 所以這個(gè)代碼沒有意義
debug模式 結(jié)果是4
release模式 結(jié)果是0
也可以這樣:#includevoidmain()//void標(biāo)識(shí)無返回值{inta,b,sum;a=1,b=2;sum=a+b;printf("sumis%d\n",sum);}
這種屬于函數(shù)返回值的隱式聲明。 隱式聲明的函數(shù)返回值類型都是int 當(dāng)然了,這個(gè)只需要了解一下就好了。不建議這么寫。 現(xiàn)在很多編譯器都不允許這樣的聲明出現(xiàn)。如果C語言中調(diào)用函數(shù)前面沒有定義它的返回值類型