A. c語言的函數調用是遞歸嗎
「遞歸」外在表現出來的形式,是:函數自己調用自己。也就是說:如果我們定義了一個函數fun(),那麼,在fun函數體中,fun這個函數自己調用自身 ,這就是表示:遞歸調用。
我們來看一下,下面這個程序段:
上述C語言程序中,第7行到第10行,就是使用「循環」的方式,來實現從0一直累加到100的和。大部分情況下,「循環」與「遞歸」之間,都可以相互轉換。
在使用遞歸的時候,需要注意以下兩點:
需要有一個「遞歸出口」,如果沒有一個出口,那麼遞歸就會一直執行下去,一直到將「棧空間」占滿為止。那時程序就會崩潰,所以一定是要有一個「遞歸出口」。
如果所要執行的次數比較多,可以盡量選擇用「循環」的方式,因為使用「遞歸」的方式,程序執行的速度會比較慢。
B. C語言函數調用的三種方式並分別舉一例。
C++函數調用有三種常見方式:thiscall,__cdecl,__stdcall
今天看了篇介紹的文章,才比較清楚了點。thiscall,用於類的成員函數調用,
__thiscall對每個函數都增加了一個類指針參數
class aa
{
void bb(int cc);
};
實際上bb的函數原形是void bb(aa &this, int cc);
以前知道類的成員函數在調用時會傳入一個this指針,而不曉得thiscall就是專門指定了這種調用方式。__cdecl調用方式即為C,C++默認的調用方式。
void Input( int &m,int &n);/*相當於void __cdecl Input(int &m,int &n);*/
其特點是:1,由主調用函數進行參數壓棧並且恢復堆棧;2,在主調用函數中進行實參的壓棧並且順序是從右到左;3,由於主調用函數管理堆棧,所以可以實現變參函數。
__stdcall則是標准調用方式,實際上就是PASCAL,CALLBACK,WINAPI ,其特點是:_主調用函數中負責壓棧,在被調用函數中負責彈出堆棧中的參數,並且負責恢復堆棧。因此不能實現變參函數,參數傳遞是從右到左。另外,命名修飾方法是在函數前加一個下劃線(_),在函數名後有符號(@),在@後面緊跟參數列表中的參數所佔位元組數(10進制),如:void Input(int &m,int &n),被修飾成:_Input@8 。
C. c語言在一個函數內部調用另一個函數的調用方法稱為___
在一個函數部調用另一個函數的調用方式稱為嵌套調用,嵌套調用就是某個函數調用另外一個函數(即函數嵌套允容許在一個函數中調用另外一個函數)。
#函數的嵌套調用:在一個函數內部調用另一個函數
deffn1():
pass
deffn2():
fn1() #函數的嵌套調用
deffn3():
fn2() #函數的嵌套調用
fn3()
(3)c語言函數調用自己方式叫做擴展閱讀:
調用注意事項:
一、前提條件:
1、兩個文件必須編入同一個可執行文件;
2、被調用函數必須是全局函數,即不能是static函數。如果有static修飾,那麼必須寫在頭文件中,並被另一個文件引用。
二、聲明:
1、可以聲明在頭文件中,並在調用文件中引用該頭文件;
2、可以直接在調用文件聲明,形式為
externRET_TYPEFUNC_NAME(PARAM_LIST);
其中extern非必須,但一般都會寫上,表示這個是其它文件定義的。
D. c語言中函數調用有三種方法,能幫忙各舉個例子嗎
1、首先在打開的C語言資料庫中,輸入【#include】,如下圖所示。
E. C語言中,函數是否可以直接或間接調用自己!!求大神!!求解析!!!
可以.C語言中,任何函數都可以直接或間接地被自己或其他函數調用,包括main函數(注意我說的是C,不是C++)
例如,典型的利用main遞歸實現逆序輸出
#include<stdio.h>
intmain()
{
intc;
if((c=getchar())!=EOF)//EOF用Ctrl+Z或者F6
{
main();
}
printf("%c",c);
return0;
}
F. C語言函數自己怎麼調用自己
這個叫遞歸,函數自己調用自己
G. C語言如何調用函數
C語言中,函數調用的一般形式為:
函數名(實際參數表)
對無參函數調用時則無實際參數表。實際參數表中的參數可以是常數、變數或其它構造類型數據及表達式。各實參之間用逗號分隔。
#include<stdio.h>
intfun(intx,inty);//函數聲明,如果函數寫在被調用處之前,可以不用聲明
voidmain()
{
inta=1,b=2,c;
c=fun(a,b);//函數的調用,調用自定義函數fun,其中a,b為實際參數,傳遞給被調用函數的輸入值
}
//自定義函數fun
intfun(intx,inty)//函數首部
{//{}中的語言為函數體
returnx>y?x:y;//返回x和y中較大的一個數
}
(7)c語言函數調用自己方式叫做擴展閱讀
C語言中不允許作嵌套的函數定義。因此各函數之間是平行的,不存在上一級函數和下一級函數的問題。但是C語言允許在一個函數的定義中出現對另一個函數的調用。
這樣就出現了函數的嵌套調用。即在被調函數中又調用其它函數。這與其它語言的子程序嵌套的情形是類似的。其關系可表示如圖。
圖表示了兩層嵌套的情形。其執行過程是:執行main函數中調用a函數的語句時,即轉去執行a函數,在a函數中調用b 函數時,又轉去執行b函數,b函數執行完畢返回a函數的斷點繼續執行,a函數執行完畢返回main函數的斷點繼續執行。
H. C語言調用自身的函數
其實是這樣的,主調函數會繼續執行被調函數之後的語句。
假設第一次執行travel,判斷root!=NULL,則會第二次執行travel,此處是travel(root->l);。
第二次執行的travel語句肯定是要返回的,當它返回之後,繼續執行第一次travel中的print_s(&root->data);。
然後再執行第三次travel,此處是travel(root->r);。
每次travel函數在if條件滿足,或者下層travel(root->r);返回之後,才會返回。
同理繼續向下遞推。
I. C語言中什麼叫調用函數為什麼函數和函數之間是調用關系
函數調用是指:簡單來講,假如小明是班長,小紅是本班的生活委員,小明要想收班費,但每個人都有不同的職責,而班長是用來組織和統籌工作的,而作為生活委員的小紅的職責之一就是收取和管理班費,所以這樣的話,小明只需讓小紅去做就行,也就是說只需發出指令給小紅就可以了,而小紅就是執行這項活動的承擔者;在這里小紅就相當於被調用函數,小明是調用函數。
函數調用總共有三種方式:
1.
函數表達式:
1函數作為表達式中的一項出現在表達式中,以函數返回值參與表達式的運算。這種方式要求函數是有返回值的。例如:z=max(x,y)是一個賦值表達式,把max的返回值賦予變數z。
2.
函數語句:
函數調用的一般形式加上分號即構成函數語句。例如:
printf
("%d",a);scanf
("%d",&b);都是以函數語句的方式調用函數。
3.
函數實參:
函數作為另一個函數調用的實際參數出現。這種情況是把該函數的返回值作為實參進行傳送,因此要求該函數必須是有返回值的。例如:
printf("%d",max(x,y));
即是把max調用的返回值又作為printf函數的實參來使用的。在函數調用中還應該注意的一個問題是求值順序的問題。所謂求值順序是指對實參表中各量是自左至右使用呢,還是自右至左使用。對此,各系統的規定不一定相同。
注意的是:1.假如在你的那句調用語句開始,例如:
#include
int
max(int
x,int
y){
if(x>y||x=y)
return
x;
else
return
y;
}
void
main(){
int
a,b;
scanf("%d%d",&a,&b)
;
printf("%d",max(a,b));
printf("程序結束\n");
}
在這個函數中,我們是在main()函數中用函數實參進行調用的,這樣的話。main()函數是一個程序的入口,
在執行
printf("%d",max(a,b));
這條語句的max(a,b)時候,開始轉到max(int,int)函數中執行,執行完後在回到printf("%d",max(a,b));
進行輸出a,b中的最大值,然後再接著執行main()函數的剩下語句
printf("程序結束\n");推出程序。但我們調用的時候,main()函數(即調用函數)需要給被調用函數提供必要的具體數據,即x,y的值。所以表達式max(a,b)即把a的值賦給x,b的值賦值給y;如此執行下去。
即若輸入
3
4
程序結果為:
4
程序結束
2.還是上面的那個例子,若int
max(int
x,int
y)在main()函數的下面,要調用的話,就需要在main()函數之前進行聲明,聲明格式為:
函數返回值類型
函數名
(形參類型1
形參名1,形參類型2
形參名2......);其中分號不可少,形參名可以省去,但是形參類型和返回值類型均不可省!!!如下所示:
#include
int
max(int
x,int
y);
//函數聲明1
或者int
max(int
,int
);
//函數聲明2
void
main(){
或者
int
max(int
x,int
y);
//函數聲明3
或者int
max(int
,int
);
//函數聲明4
int
a,b;
scanf("%d%d",&a,&b)
;
printf("%d",max(a,b));
printf("程序結束\n");
}
int
max(int
x,int
y){
if(x>y||x=y)
return
x;
else
return
y;
}
函數聲明的作用是讓調用函數認識被調用函數,這樣才可以想被調用函數發送指令!
至於為什麼用調用這個名字,個人覺得這個是因為很貼切吧,便於理解!!!
你明白了嗎?不明白可以追問哦!希望採納哦!
J. C語言中函數調用有幾種情況
函數調用有倆種情況
1:聲明函數,然後直接在函數體內調用函數,這樣的做法是先保存當前函數執行的地址,然後查找函數指針,找到函數聲明,再找到函數實現,創建一個函數堆棧,直接在函數堆棧裡面操作,然後將返回值傳給主函數。然後通過之前保存的地址,繼續執行之後的代碼。過程比較復雜。
2:內聯函數和動態庫調用,這倆種方法的函數調用比較奇特,他們不會創建單獨的函數堆棧,而是執行到內聯函數和動態庫調用區域,直接將這部分代碼,類似於「粘貼」到主函數中,省去了保存當前代碼執行地址,等等一系列的操作,省去了很多內存空間,增加帶代碼的執行效率。適合於保存一些使用頻率很高的小代碼。能節省很多的程序運行時間。