新聞中心
C語言函數(shù)問題:請問這個程序的輸出答案是什么,需要解釋為什么答案是這個。
2, 6, 42, 3
創(chuàng)新互聯(lián)建站主要從事成都網(wǎng)站設計、成都網(wǎng)站建設、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務鳳翔,10余年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:13518219792
開始看到這個程序,我覺得明顯有問題,可是運行了下,卻極其正常。找了下資料發(fā)現(xiàn),得主要是static和局部、全局量的作用域的問題。
注意這兩點,然后再去分析程序:
1.靜態(tài)局部變量在程序編譯時被首次初始化,即以后的函數(shù)調用不再進行初始化,而是使用上次調用結束時的值。靜態(tài)量數(shù)據(jù)有單獨的存儲區(qū)。
2.全局變量在整個函數(shù)有效,但是當某個局部變量與全局變量同名時,在該局部變量所在域內,只有該局部變量有效,與其同名的全局變量無效。
在所述程序中,全局變量i在for的{}內是無效的,起作用是靜態(tài)局部變量i。而靜態(tài)變量編譯時初始值為1。另,for的循環(huán)控制部分在{}外,起作用的全局量i。
在下面的分析中1.指第一次循環(huán),依此類推。
int Square(int i)
{
return i*i; //返回i^2給調用者;
}
main()
{
int i=0; //i=0;
i = Square(i); //調用Square,i=i^2,即0=0^2=0;
for ( ; i3; i++) //1.第一輪循環(huán),i(全局)為0,滿足條件
{ //2.第二輪循環(huán)開始i=1
//3.第三輪開始,i為2
//4.i=3,不符,循環(huán)退出
static int i=1; //程序編譯時被賦值為1,以后不再賦值。
//1.此時用的是編譯時被賦的值,即1;
//2.i(局部)為上次調用結束時的結果2
//3.原理同上,此時為6
i += Square(i); //1.i=1+1*1=2
//2.i=2+2*2=6
//3.i=6+6*6=42
printf("%d, ", i); //1.輸出:2+,+空格
//2.輸出:6+,+空格
//3.輸出:42+,+空格
} //1.第一次循環(huán)結束,i(全局,原為0)+1,值為1
//2.第二輪循環(huán)結束,i(全局)+1,是2
//3.第三輪循環(huán)結束,i為3
printf("%d\n", i);//輸出外部變量i,其值為循環(huán) 退出時的值3.
}
其實,把外部變量換個名字是一樣的效果。更容易明白。如下:
int main(int argc, char* argv[])
{
int j=0;
j = Square(j);
for ( ; j3; j++)
{
static int i=1;
i += Square(i);
printf("%d, ", i);
}
printf("%d\n", j);
return 0;
}
C語言函數(shù)遞歸調用習題,求答案解析
由于是遞歸調用,所以,程序在打印結果的時候是從最內層函數(shù)開始打印,于是,就得到136.因為遞歸調用其實是嵌套調用,只是嵌套的是函數(shù)自身。這樣,需要將最內層的函數(shù)執(zhí)行完畢,才開始執(zhí)行外層的,一層一層往外執(zhí)行完畢,最后是main函數(shù)。若將遞歸還原為順序程序,流程是這樣:樓主得到的631其實是從6開始被存放到某堆棧中的,這樣,1便成為最頂上的數(shù),而6成為最底部的數(shù)。而最后打印的時候,需要彈棧,出棧順序為:自頂向下出棧,于是,得到的結果為136樓主的解題過程是對的,但可能沒理解遞歸的意義。建議樓主翻閱關于遞歸的相關文章看看。
不用注冊的C語言函數(shù)查詢軟件哪里有啊!!!!
提供兩個連接給你,自己去下載:
第一個:
第二個:
分享文章:C語言函數(shù)解析答案軟件 c語言題目解析軟件
文章分享:http://ef60e0e.cn/article/dosijhi.html