




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
本章導讀在第一章中已經介紹過,C源程序是由函數組成的。雖然在前面各章的程序中都只有一個主函數main(),但實用程序往往由多個函數組成。函數是C源程序的基本模塊,通過對函數模塊的調用實現特定的功能。C語言中的函數相當于其它高級語言的子程序。C語言不僅提供了極為豐富的庫函數(如TurboC,MSC都提供了三百多個庫函數),還允許用戶建立自己定義的函數。用戶可把自己的算法編成一個個相對獨立的函數模塊,然后用調用的方法來使用函數。由于采用了函數模塊式的結構,C語言易于實現結構化程序設計。使程序的層次結構清晰,便于程序的編寫、閱讀、調試。《C語言程序設計》
(VisualC++6.0環境)返回本書目錄第5章函數與預處理《C語言程序設計》
(VisualC++6.0環境)返回本書目錄第5章函數與預處理本章主要知識點
(1)函數應用的C程序實例
(2)函數的定義
(3) 函數調用
(4)函數的嵌套調用和遞歸調用
(5) 內聯函數和重載函數
(6)作用域
(7)變量及函數的存儲類型
(8) 編譯預處理第5章函數與預處理《C語言程序設計》
(VisualC++6.0環境)返回本章導讀5.2函數的定義5.3函數調用5.5內聯函數和重載函數5.4函數的嵌套調用和遞歸調用5.1函數應用的C程序實例5.6作用域5.7變量及函數的存儲類型5.8編譯預處理《C語言程序設計》
(VisualC++6.0環境)返回本章目錄5.1.1函數應用的C程序實例5.1函數應用的C程序實例《C語言程序設計》
(VisualC++6.0環境)返回本節目錄2.C程序實例(2)1.C程序實例(1)5.1.1函數應用的C程序實例5.1.1C程序實例(1)《C語言程序設計》
(VisualC++6.0環境)返回本節目錄1.C程序實例1【例5.1】簡單的函數調用的例子/*功能:定義兩個輸出函數并在主函數中調用*//*程序代碼文件名:l5_1.cpp/#include"stdio.h"voidprintst()/*printst函數*/{printf("****************\n");}voidprint_hello()/*print_hello函數*/{printf("Hello!\n");}程序演示5.1.1C程序實例(1)《C語言程序設計》
(VisualC++6.0環境)返回本節目錄main(){printst();/*調用prigtst函數*/print_hello();/*調用print_hello函數*/printst();/*調用prigtst函數*/}程序運行情況如下:****************Hello!****************程序演示[例5.1]程序演示單擊運行輸入源程序彈出運行結果窗口運行結果返回例題返回本節目錄5.1.1C程序實例(2)《C語言程序設計》
(VisualC++6.0環境)2.C程序實例2【例5.2】定義一個函數,用于求兩個數中的大數。/*程序代碼文件名:l5_2cpp//*功能:定義一個求較大數的函數并在主函數中調用*/
#include"stdio.h"intmax(intn1,intn2) /*定義一個函數max()*/{return(n1>n2?n1:n2);}main(){intmax(intn1,intn2); /*函數說明*/intnum1,num2;printf("inputtwonumbers:\n");scanf("%d%d",&num1,&num2);printf("max=%d\n",max(num1,num2));}
程序運行結果為:inputtwonumbers:5 6<CR>max=6返回本節目錄程序演示[例5.2]程序演示單擊運行輸入源程序彈出運行結果窗口運行結果返回例題返回本節目錄《C語言程序設計》
(VisualC++6.0環境)返回本章目錄5.2.2函數原型5.2.1函數的定義5.2函數的定義5.2.1函數的定義《C語言程序設計》
(VisualC++6.0環境)1.無參函數的一般形式
返回本節目錄類型說明符函數名(){類型說明語句}其中類型說明符和函數名稱為函數頭。類型說明符指明了本函數的類型,函數的類型實際上是函數返回值的類型。該類型說明符與第二章介紹的各種說明符相同。函數名是由用戶定義的標識符,函數名后有一個空括號,其中無參數,但括號不可少。{}中的內容稱為函數體。在函數體中也有類型說明,這是對函數體內部所用到的變量的類型說明。【例4.1】中的printst(),print_hello()函數都是無參函數。在很多情況下都不要求無參函數有返回值,因此可以不寫類型說明符。5.2.1函數的定義《C語言程序設計》
(VisualC++6.0環境)2.有參函數的一般形式
類型說明符函數名(形式參數表)形式參數類型說明{類型說明語句}
有參函數比無參函數多了兩個內容,其一是形式參數表,其二是形式參數類型說明。在形參表中給出的參數稱為形式參數,它們可以是各種類型的變量,各參數之間用逗號間隔。在進行函數調用時,主調函數將賦予這些形式參數實際的值。形參既然是變量,當然必須給以類型說明。返回本節目錄5.2.1函數的定義《C語言程序設計》
(VisualC++6.0環境)3.說明
(1)函數定義不允許嵌套。在C語言中,所有函數(包括主函數main())都是平行的。一個函數的定義,可以放在程序中的任意位置,主函數main()之前或之后。但在一個函數的函數體內,不能再定義另一個函數,即不能嵌套定義。(2)空函數──既無參數、函數體又為空的函數。其一般形式為:[函數類型]函數名(void){}(3)在老版本C語言中,參數類型說明允許放在函數說明部分的第2行單獨指定。返回本節目錄5.2.2函數原型《C語言程序設計》
(VisualC++6.0環境)返回本節目錄在ANSIC新標準中,采用函數原型方式,對被調用函數進行說明,其一般格式如下:函數類型函數名(數據類型[參數名][,數據類型[參數名2]…]);例如intputlll(intx,inty,intz,intcolor,char*p)/*說明一個整型函數*/char*name(void);/*說明一個字符串指什函數*/voidstudent(intn,char*str);/*說明一個不返回值的函數*/floatcalculate();/*說明一個浮點型函數*/
C語言同時又規定,在以下2種情況下,可以省去對被調用函數的說明:①當被調用函數的函數定義出現在調用函數之前時。因為在調用之前,編譯系統已經知道了被調用函數的函數類型、參數個數、類型和順序。②如果在所有函數定義之前,在函數外部(例如文件開始處)預先對各個函數進行了說明,則在調用函數中可缺省對被調用函數的說明。注意:
如果一個函數沒有說明就被調用,編譯程序并不認為出錯,而將此函數默認為整型(int)函數。因此當一個函數返回其它類型,又沒有事先說明,編譯時將會出錯。《C語言程序設計》
(VisualC++6.0環境)返回本章目錄5.3.2函數傳值調用5.3.1函數調用5.3函數調用5.3.3
函數返回值5.3.1函數調用《C語言程序設計》
(VisualC++6.0環境)
函數調用的一般形式為:函數名([實際參數表])
切記:實參的個數、類型和順序,應該與被調用函數所要求的參數個數、類型和順序一致,才能正確地進行數據傳遞。在C語言中,可以用以下幾種方式調用函數:(1)函數表達式。函數作為表達式的一項,出現在表達式中,以函數返回值參與表達式的運算。這種方式要求函數是有返回值的。(2)函數語句。C語言中的函數可以只進行某些操作而不返回函數值,這時的函數調用可作為一條獨立的語句。(3)函數實參。函數作為另一個函數調用的實際參數出現。這種情況是把該函數的返回值作為實參進行傳送,因此要求該函數必須是有返回值的。返回本節目錄5.3.1函數調用《C語言程序設計》
(VisualC++6.0環境)說明:(1)調用函數時,函數名稱必須與具有該功能的自定義函數名稱完全一致。(2)實參在類型上按順序與形參,必須一一對應和匹配。如果類型不匹配,C編譯程序將按賦值兼容的規則進行轉換。如果實參和形參的類型不賦值兼容,通常并不給出出錯信息,且程序仍然繼續執行,只是得不到正確的結果。(3)如果實參表中包括多個參數,對實參的求值順序隨系統而異。有的系統按自左向右順序求實參的值,有的系統則相反。返回本節目錄5.3.2函數傳值調用《C語言程序設計》
(VisualC++6.0環境)返回本節目錄1.函數的參數分為形參和實參兩種,作用是實現數據傳送。
形參出現在函數定義中,只能在該函數體內使用。發生函數調用時,調用函數把實參的值復制1份,傳送給被調用函數的形參,從而實現調用函數向被調用函數的數據傳送。【例5.3】
實參對形參的數據傳遞。/*實參對形參的數據傳遞。*//*程序代碼文件名:l5_3.cpp/#include"stdio.h"voidmain(){voidso(intn);/*說明函數*/intn=100;/*定義實參n,并初始化*/so(n);/*調用函數*/5.3.2函數傳值調用《C語言程序設計》
(VisualC++6.0環境)返回本節目錄
printf("n_so=%d\n",n);/*輸出調用后實參的值,便于進行比較*/}voidso(intn){inti;printf("n_x=%d\n",n);/*輸出改變前形參的值*/for(i=n-1;i>=1;i--)n=n+i;/*改變形參的值*/printf("n_x=%d\n",n);/*輸出改變后形參的值*/}程序運行結果為:n_x=100n_x=5050n_x=1005.3.2函數傳值調用《C語言程序設計》
(VisualC++6.0環境)返回本節目錄說明:(1)實參可以是常量、變量、表達式、函數等。無論實參是何種類型的量,在進行函數調用時,它們都必須具有確定的值,以便把這些值傳送給形參。因此,應預先用賦值、輸入等辦法,使實參獲得確定的值。(2)形參變量只有在被調用時,才分配內存單元;調用結束時,即刻釋放所分配的內存單元。因此,形參只有在該函數內有效。調用結束,返回調用函數后,則不能再使用該形參變量。(3)實參對形參的數據傳送是單向的,即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。(4)實參和形參占用不同的內存單元,即使同名也互不影響。5.3.2函數傳值調用《C語言程序設計》
(VisualC++6.0環境)返回本節目錄2.數組元素作為函數參數
數組元素就是下標變量,它與普通變量并無區別。數組元素只能用作函數實參,其用法與普通變量完全相同:在發生函數調用時,把數組元素的值傳送給形參,實現單向值傳送。說明:(1)用數組元素作實參時,只要數組類型和函數的形參類型一致即可,并不要求函數的形參也是下標變量。換句話說,對數組元素的處理是按普通變量對待的。(2)在普通變量或下標變量作函數參數時,形參變量和實參變量是由編譯系統分配的兩個不同的內存單元。在函數調用時發生的值傳送,是把實參變量的值賦予形參變量。5.3.2函數傳值調用《C語言程序設計》
(VisualC++6.0環境)返回本節目錄3.數組名作為函數參數用數組名作函數參數與用數組元素作實參有幾點不同:(1).用數組元素作實參時,只要數組類型和函數的形參變量的類型一致,那么作為下標變量的數組元素的類型也和函數形參變量的類型是一致的。因此,并不要求函數的形參也是下標變量。用數組名作函數參數時,則要求形參和相對應的實參都必須是類型相同的數組,都必須有明確的數組說明。當形參和實參二者不一致時,即會發生錯誤。(2).在普通變量或下標變量作函數參數時,形參變量和實參變量是由編譯系統分配的兩個不同的內存單元。在函數調用時發生的值傳送是把實參變量的值賦予形參變量。在用數組名作函數參數時,不是進行值的傳送,即不是把實參數組的每一個元素的值都5.3.2函數傳值調用《C語言程序設計》
(VisualC++6.0環境)返回本節目錄
賦予形參數組的各個元素。因為實際上形參數組并不存在,編譯系統不為形參數組分配內存。那么,數據的傳送是如何實現的呢?在第三章中我們曾介紹過,數組名就是數組的首地址。因此在數組名作函數參數時所進行的傳送只是地址的傳送,也就是說把實參數組的首地址賦予形參數組名。形參數組名取得該首地址之后,也就等于有了實在的數組。實際上是形參數組和實參數組為同一數組,共同擁有一段內存空間。【例5.4】數組a中存放了一個學生5門課程的成績,求平均成績。/*程序代碼文件名:l5_4.cpp//*功能:數組名作為函數實參*/floataver(floata[5]){inti;floatav,s=a[0];for(i=1;i<5;i++)s=s+a[i];5.3.2函數傳值調用《C語言程序設計》
(VisualC++6.0環境)返回本節目錄
av=s/5;returnav;}#include"stdio.h"voidmain(){floatsco[5],av;inti;printf("\ninput5scores:");for(i=0;i<5;i++)scanf("%f",&sco[i]);av=aver(sco);printf("averagescoreis%5.2f",av);}
5.3.2函數傳值調用《C語言程序設計》
(VisualC++6.0環境)返回本節目錄程序運行結果為:input5scores:8965.078.89990.5<CR>averagescoreis84.46程序說明:
本程序首先定義了一個實型函數aver,有一個形參為實型數組a,長度為5。在函數aver中,把各元素值相加求出平均值,返回給主函數。主函數main中首先完成數組sco的輸入,然后以sco作為實參調用aver函數,函數返回值送av,最后輸出av值。從運行情況可以看出,程序實現了所要求的功能用數組名作為函數參數時還應注意以下幾點:a形參數組和實參數組的類型必須一致,否則將引起錯誤。b形參數組和實參數組的長度可以不相同,因為在調用時,只傳送首地址而不檢查形參數組的長度。當形參數組的長度與實參數組不一致時,雖不至于出現語法錯誤(編譯能通過),但程序執行結果將與實際不符,這是應予以注意的。
5.3.3函數返回值《C語言程序設計》
(VisualC++6.0環境)返回本節目錄1函數返回值與return語句。有參函數的返回值,是通過函數中的return語句來獲得的。(1)return語句的一般格式:return(返回值表達式); (2)return語句的功能:返回調用函數,并將“返回值表達式”的值帶給調用函數。【例5.5】函數返回值的例子/*程序代碼文件名:l5_5.cpp//*功能:求最大值*/
#include"stdio.h"main(){intmaxmum(intx,inty,intz);/*說明一個用戶自定義函數*/inti,j,k,max;
5.3.3函數返回值《C語言程序設計》
(VisualC++6.0環境)返回本節目錄
scanf("%d%d%d",&i,&j,&k);max=maxmum(i,j,k); /*調用子函數,并將返回值賦給max*/printf("Themaxmumvalueis%d\n",max);}intmaxmum(intx,inty,intz){intmax;max=x>y?x:y; /*求最大值*/max=max>z?max:z;return(max); /*返回最大值*/}程序運行情況如下:779956<CR>Themaxmumvalueis99valueis99
5.3.3函數返回值《C語言程序設計》
(VisualC++6.0環境)返回本節目錄2關于返回語句的說明
(1)函數的返回值只能有一個。
(2)當函數中不需要指明返回值時,可以寫成:
return;也可以不寫。函數運行到右花括號自然結束。
(3)一個函數體內可以有多個返回語句,不論執行到哪一個,函數都結束,回到主調函數。
(4)當函數沒有指明返回值,即return;或沒有返回語句時,函數執行后實際上不是沒有返回值,而是返回一個不確定的值,有可能給程序帶來某種意外的影響。5.3.3函數返回值《C語言程序設計》
(VisualC++6.0環境)返回本節目錄3、關于函數返回值的類型
函數定義時的類型就是函數返回值的類型。從理論上,C語言要求函數定義的類型應當與返回語句中表達式的類型保持一致。當兩者不一致時,系統自動進行轉換,將函數返回語句中表達式的類型轉換為函數定義時的類型。《C語言程序設計》
(VisualC++6.0環境)返回本章目錄5.4.2函數的遞歸調用5.4.1函數的嵌套調用5.4函數的嵌套調用和遞歸調用5.4.1函數的嵌套調用《C語言程序設計》
(VisualC++6.0環境)
C語言中不允許作嵌套的函數定義。因此各函數之間是平行的,不存在上一級函數和下一級函數的問題。但是C語言允許在一個函數的定義中出現對另一個函數的調用。這樣就出現了函數的嵌套調用。即在被調函數中又調用其它函數。其關系可表示如下圖:其執行過程是:執行main函數中調用f1函數的語句時,即轉去執行f1函數,在f1函數中調用f2函數時,又轉去執行f2函數,f2函數執行完畢返回f1函數的斷點繼續執行,f1函數執行完畢返回main函數的斷點繼續執行返回本節目錄5.4.1函數的嵌套調用《C語言程序設計》
(VisualC++6.0環境)【例5.6】計算s=1k+2k+3k+……+Nk
/*程序代碼文件名:l5_6.cpp//*功能:函數的嵌套調用*/#defineK4#defineN5#include"stdio.h"longf1(intn,intk) /*計算n的k次方*/{longpower=n;inti;for(i=1;i<k;i++)power*=n;returnpower;}longf2(intn,intk) /*計算1到n的k次方之累加和*/{longsum=0;
返回本節目錄5.4.1函數的嵌套調用《C語言程序設計》
(VisualC++6.0環境)
inti;for(i=1;i<=n;i++)sum+=f1(i,k);returnsum;}main(){printf("Sumof%dpowersofintegersfrom1to%ld=",K,N);printf("%d\n",f2(N,K));
}程序運行結果為:Sumof4powersofintegersfrom1to5=979說明:本題編寫了兩個函數,一個是用來計算n的k次方的函數f1,另一個是用來計算1到n的k次方之累加和函數f2。主函數先調f1計算n的k次方,再在f1中以為n的k次方實參,調用f2計算其累加和,然后返回f1,再返回主函數。返回本節目錄5.4.2函數的遞歸調用《C語言程序設計》
(VisualC++6.0環境)
一個函數在它的函數體內調用它自身稱為遞歸調用。這種函數稱為遞歸函數。在遞歸調用中,主調函數又是被調函數。執行遞歸函數將反復調用其自身。例如有函數f如下:
intf(intx){inty;z=f(y);returnz;}這個函數是一個遞歸函數。但是運行該函數將無休止地調用其自身,這當然是不正確的。為了防止遞歸調用無終止地進行,必須在函數內有終止遞歸調用的手段。常用的辦法是加條件判斷,滿足某種條件后就不再作遞歸調用,然后逐層返回。返回本節目錄5.4.2函數的遞歸調用《C語言程序設計》
(VisualC++6.0環境)例5.7】用遞歸法計算n!。/*程序代碼文件名:l5_7.cpp//*功能:通過函數的遞歸調用計算階乘*/#include"stdio.h"longpower(intn){longf;if(n>1)f=power(n-1)*n;elsef=1;return(f);}main(){intn;longy;返回本節目錄5.4.2函數的遞歸調用《C語言程序設計》
(VisualC++6.0環境)
printf("inputainteagernumber:");scanf("%d",&n);y=power(n);printf("%d!=%ld\n",n,y);}
程序運行情況如下:inputainteagernumber:5<CR>5!=120程序說明:
程序中給出的函數power是一個遞歸函數。主函數調用power后即進入函數power執行,如果n<0,n==0或n=1時都將結束函數的執行,否則就遞歸調用power函數自身。由于每次遞歸調用的實參為n-1,即把n-1的值賦予形參n,最后當n-1的值為1時再作遞歸調用,形參n的值也為1,將使遞歸終止。然后可逐層退回。返回本節目錄《C語言程序設計》
(VisualC++6.0環境)返回本章目錄5.5.2重載函數5.5.1內聯函數5.5內聯函數和重載函數5.5.1內聯函數 《C語言程序設計》
(VisualC++6.0環境)返回本節目錄
調用函數時需要一定的時間,如果有的函數需要頻繁使用,則所用時間會很長,從而降低程序的執行效率。C十十提供一種提高效率的方法,即在編譯時將所調用函數的代碼嵌入到主調函數中。這種嵌入到主調函數中的函數稱為內聯函數(inlinefunction),又稱內嵌函數。指定內聯函數的方法很簡單,只需在函數首行的左端加一個關鍵字inline即可。【例5.8】將函數指定為內聯函數。/*程序代碼文件名:l5_8.cpp//*功能:通過內置函數求3個整數中的最大者*/#include<iostream.h>inlineintmax(inta.intb,intc)//這是一個內置函數,求3個整數中的最大者{if(b>a)a=b;5.5.1內聯函數 《C語言程序設計》
(VisualC++6.0環境)返回本節目錄
if(c>a)a=c;returna;}voidmain(){inti=7,j=10,k=25,m;m=max(i,j,k);cout<<”max=”<<m<<endl;}
由于在定義函數時指定它為內聯函數,因此編譯系統在遇到函數調用max(i,j,k)時,就用max函數體的代碼代替max(i,j,k),同時將實參代替形參。這樣,m=max(i,j,k);就被置換成if(j>i)i=j;if(k>i)i=k;m=i;5.5.2重載函數《C語言程序設計》
(VisualC++6.0環境)返回本節目錄
在C++中用到了插入運算符<<和提取運算符>>。這兩個運算符本來是左移運算符和右移運算符,現在把它作為輸入輸出運算符。即允許一個運算符用于不同場合,有不同的含義,這就叫運算符的“重載”(overloading),即重新賦予它新的含義。函數也可以重載。C++允許在同一作用域中用同一函數名定義多個函數,這些函數的參數個數和參數類型不同。這就是函數的重載,即一個函數名多用。5.5.2重載函數《C語言程序設計》
(VisualC++6.0環境)返回本節目錄【例5.9】求n個整數中的最大數。n的值為2和3。/*程序代碼文件名:l5_9.cpp//*功能:通過函數的重載求n個整數中的最大者*/#include<iostream.h>intmax(inta,intb,intc)//求3個整數中的最大者
{if(b>a)a=b;if(c>a)a=c;returna;}intmax(inta,intb)//求2個整數中的最大者
{if(a>b)returna;elsereturnb*}5.5.2重載函數《C語言程序設計》
(VisualC++6.0環境)返回本節目錄voidmain(){inta=7,b=4,c=11;cout<<max(a,b,c)<<endl;//輸出3個整數中的最大者
cout<<max(a,b)<<endl;//輸出2個整數中的最大者}運行結果如下:117
兩次調用max函數的參數個數不同,系統會根據參數的個數找到與之匹配的函數并調用它。參數的個數和類型可以都不同。應當注意:重載函數的參數個數或類型必須至少有一者不同,函數返回值類型可以相同也可以不同。但不允許參數個數和類型都相同而只有返回值類型不同,因為系統無法從函數的調用形式上判斷哪一個函數與之匹配。《C語言程序設計》
(VisualC++6.0環境)返回本章目錄5.6.2全局變量和局部變量5.6.1
作用域5.6作用域5.6.1作用域《C語言程序設計》
(VisualC++6.0環境)返回本節目錄
在討論函數的形參變量時曾經提到,形參變量只在被調用期間才分配內存單元,調用結束立即釋放。這一點表明形參變量只有在函數內才是有效的,離開該函數就不能再使用了。這種變量有效性的范圍稱變量的作用域。不僅對于形參變量,C語言中所有的量都有自己的作用域。變量說明的方式不同,其作用域也不同。C語言中的變量,按作用域范圍可分為兩種,即局部變量和全局變量。5.6.2全局變量和局部變量《C語言程序設計》
(VisualC++6.0環境)1.局部變量
返回本節目錄
在一個函數內部說明的變量是內部變量,它只在該函數范圍內有效。也就是說,只有在包含變量說明的函數內部,才能使用被說明的變量,在此函數之外就不能使用這些變量了。所以內部變量也稱“局部變量”。例如:intf1(inta)/*函數f1*/{intb,c;……} /*a,b,c作用域:僅限于函數f1()中*/intf2(intx)/*函數f2*/{inty,z;……} /*x,y,z作用域:僅限于函數f2()中*/main(){intm,n;……} /*m,n作用域:僅限于函數main()中*/5.6.2全局變量和局部變量《C語言程序設計》
(VisualC++6.0環境)2.全局變量
返回本節目錄
全局變量也稱為外部變量,它是在函數外部定義的變量。它不屬于哪一個函數,它屬于一個源程序文件。其作用域是整個源程序。在函數中使用全局變量,一般應作全局變量說明。只有在函數內經過說明的全局變量才能使用。全局變量的說明符為extern。但在一個函數之前定義的全局變量,在該函數內使用可不再加以說明。例如:inta,b;/*外部變量*/voidf1()/*函數f1*/{……}5.6.2全局變量和局部變量《C語言程序設計》
(VisualC++6.0環境)返回本節目錄floatx,y;/*外部變量*/intfz()/*函數fz*/{……}main()/*主函數*/{……}/*全局變量x,y作用域全局變量a,b作用域*/從上例可以看出a、b、x、y都是在函數外部定義的外部變量,都是全局變量。但x,y定義在函數f1之后,而在f1內又無對x,y的說明,所以它們在f1內無效。a,b定義在源程序最前面,因此在f1,f2及main內不加說明也可使用。5.6.2全局變量和局部變量《C語言程序設計》
(VisualC++6.0環境)返回本節目錄【例5.10】輸入長方體的長寬高l,w,h。求體積及三個面x*y,x*z,y*z的面積。/*程序代碼文件名:l5_10.cpp//*功能:求長方體體積及三個面x*y,x*z,y*z的面積。*/#include<stdio.h>
ints1,s2,s3;intvs(inta,intb,intc){intv;v=a*b*c;s1=a*b;s2=b*c;s3=a*c;returnv;}5.6.2全局變量和局部變量《C語言程序設計》
(VisualC++6.0環境)返回本節目錄main(){intv,l,w,h;printf("\ninputlength,widthandheight:");scanf("%d%d%d",&l,&w,&h);v=vs(l,w,h);printf("v=%ds1=%ds2=%ds3=%d\n",v,s1,s2,s3);}程序運行結果如下:inputlength,widthandheight:456<CR>v=120s1=20s2=30s3=245.6.2全局變量和局部變量《C語言程序設計》
(VisualC++6.0環境)返回本節目錄
程序說明:
本程序中定義了三個外部變量s1,s2,s3,用來存放三個面積,其作用域為整個程序。函數vs用來求正方體體積和三個面積,函數的返回值為體積v。由主函數完成長寬高的輸入及結果輸出。由于C語言規定函數返回值只有一個,當需要增加函數的返回數據時,用外部變量是一種很好的方式。本例中,如不使用外部變量,在主函數中就不可能取得v,s1,s2,s3四個值。而采用了外部變量,在函數vs中求得的s1,s2,s3值在main中仍然有效。因此外部變量是實現函數之間數據通訊的有效手段。《C語言程序設計》
(VisualC++6.0環境)返回本章目錄5.7.2函數的存儲類型5.7.1變量的存儲類型5.7變量及函數的存儲類型5.7.1變量的存儲類型《C語言程序設計》
(VisualC++6.0環境)1.自動變量
返回本節目錄自動變量的類型說明符為auto這種存儲類型是C語言程序中使用最廣泛的一種類型。C語言規定,函數內凡未加存儲類型說明的變量均視為自動變量,也就是說自動變量可省去說明符auto。在前面各章的程序中所定義的變量凡未加存儲類型說明符的都是自動變量。例如:{inta,b,k;charc;……}等價于:{autointa,b,k;autocharc;……}5.7.1變量的存儲類型《C語言程序設計》
(VisualC++6.0環境)返回本節目錄自動變量具有以下特點:自動變量的作用域僅限于定義該變量的個體內。自動變量屬于動態存儲方式,只有在使用它,即定義該變量的函數被調用時才給它分配存儲單元,開始它的生存期。函數調用結束,釋放存儲單元,結束生存期。因此函數調用結束之后,自動變量的值不能保留。由于自動變量的作用域和生存期都局限于定義它的個體內(函數或復合語句內),因此不同的個體中允許使用同名的變量而不會混淆。對構造類型的自動變量如數組等,不可作初始化賦值。5.7.1變量的存儲類型《C語言程序設計》
(VisualC++6.0環境)2.外部變量
返回本節目錄外部變量的類型說明符為extern。在前面介紹全局變量時已介紹過外部變量。這里再補充說明外部變量的幾個特點:(1)外部變量和全局變量是對同一類變量的兩種不同角度的提法。全局變量是從它的作用域提出的,外部變量從它的存儲方式提出的,表示了它的生存期。(2)當一個源程序由若干個源文件組成時,在一個源文件中定義的外部變量在其它的源文件中也有效。5.7.1變量的存儲類型《C語言程序設計》
(VisualC++6.0環境)3.靜態變量
返回本節目錄靜態變量的類型說明符是static。靜態變量當然是屬于靜態存儲方式,但是屬于靜態存儲方式的量不一定就是靜態變量,例如外部變量雖屬于靜態存儲方式,但不一定是靜態變量,必須由static加以定義后才能成為靜態外部變量,或稱靜態全局變量。對于自動變量,前面已經介紹它屬于動態存儲方式。但是也可以用static定義它為靜態自動變量,或稱靜態局部變量。4.寄存器變量寄存器變量的說明符是register
。這種變量存放在CPU的寄存器中,使用時,不需要訪問內存,而直接從寄存器中讀寫,這樣可提高效率。5.7.2函數的存儲類型《C語言程序設計》
(VisualC++6.0環境)1.內部函數(又稱靜態函數)
返回本節目錄如果在一個源文件中定義的函數,只能被本文件中的函數調用,而不能被同一程序其它文件中的函數調用,這種函數稱為內部函數。定義一個內部函數,只需在函數類型前再加一個“static”關鍵字即可,如下所示:static函數類型函數名(函數參數表){……}關鍵字“static”,譯成中文就是“靜態的”,所以內部函數又稱靜態函數。但此處“static”的含義不是指存儲方式,而是指對函數的作用域僅局限于本文件。使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名,因為同名也沒有關系。5.7.2函數的存儲類型《C語言程序設計》
(VisualC++6.0環境)2.外部函數
返回本節目錄外部函數的定義:在定義函數時,如果沒有加關鍵字“static”,冠以關鍵字“extern”,表示此函數是外部函數:[extern]函數類型函數名(函數參數表){……}調用外部函數時,需要對其進行說明:[extern]函數類型函數名(參數類型表)[,函數名2(參數類型表2)……];《C語言程序設計》
(VisualC++6.0環境)返回本節目錄所謂預處理:指在進行編譯的第一遍掃描(詞法掃描和語法分析)之前所作的工作。它由預處理程序負責完成。以“#”號開頭的預處理命令。一般都放在源文件的前面,它們稱為預處理部分。分類:C語言提供了多種預處理功能,如宏定義、文件包含、
條件編譯等。作用:合理使用預處理功能編寫的程序便于閱讀、修改、
移植和調試,也有利于模塊化程序設計。5.8編譯預處理《C語言程序設計》
(VisualC++6.0環境)返回本章目錄5.8.2文件包含5.8.1宏定義5.8編譯預處理5.8.3條件編譯5.8.1宏定義《C語言程序設計》
(VisualC++6.0環境)返回本節目錄宏:在C語言源程序中用一個標識符來表示一個字符串。宏名:被定義為“宏”的標識符稱為“宏名”。宏代換:在編譯預處理時,對程序中所有出現的“宏名”,都用宏定義中的字符串去代換,
這稱為“宏代換”或“宏展開”。
宏定義是由源程序中的宏定義命令完成的。宏代換是由預處理程序自動完成的。分類:無參宏、有參宏5.8.1宏定義《C語言程序設計》
(VisualC++6.0環境)1.無參宏定義
返回本節目錄定義:無參宏的宏名后不帶參數。一般形式為:#define標識符字符串說明:“#”表示是一條預處理命令。凡是以“#”開頭的為預處理命令。“define”為宏定義命令。“標識符”為所定義的宏名。“字符串”可以是常數、表達式、格式串等。應用:符號常量程序中反復使用的表達式5.8.1宏定義《C語言程序設計》
(VisualC++6.0環境)1.無參宏定義
返回本節目錄說明:(1)
只是一種簡單的代換,預處理程序對它不作任何檢查。如有錯誤,只能在編譯已被宏展開后的源程序時發現。(2)
宏定義不是說明或語句,在行末不必加分號(3)
宏定義必須寫在函數之外,其作用域為宏定義命令起到源程序結
束。如要終止其作用域可使用#
undef命令,(4)
宏名在源程序中若用引號括起來,則預處理程序不對其作宏代換。(5)
宏定義允許嵌套,在宏展開時由預處理程序層層代換。例如:(6)
習慣上宏名用大寫字母表示,但也允許用小寫字母。(7)
可用宏定義表示數據類型,使書寫方便。(8)
對“輸出格式”作宏定義,可以減少書寫麻煩。5.8.1宏定義《C語言程序設計》
(VisualC++6.0環境)2.帶參宏定義
返回本節目錄C語言允許宏帶有參數。在宏定義中的參數稱為-----形式參數,在宏調用中的參數稱為-----實際參數。對帶參數的宏,調用中,要宏展開,
還要用實參去代換形參。②帶參宏定義形式:
#define
宏名(形參表)
字符串
在字符串中含有各個形參。③帶參宏調用的一般形式為:
宏名(實參表);5.8.1宏定義《
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 健身俱樂部入股協議書
- 食堂費用補貼協議書
- 高壓配電施工協議書
- 集體資金使用協議書
- 長春專利保護協議書
- 面試審查就業協議書
- 資金撥付告知協議書
- 集中斗毆和解協議書
- 跟兄弟分錢寫協議書
- 餐廳消防責任協議書
- MOOC 學術英語寫作-東南大學 中國大學慕課答案
- 浙江理工大學研究生培養方案專家論證意見表
- T∕CADERM 3033-2020 創傷中心創傷復蘇單元內醫師 站位及分工規范
- 高等數學(下)無窮級數PPT通用PPT課件
- 大傾角皮帶輸送機設計(全套圖紙)
- 《老北京四合院》
- 常用化學中英文名詞對照表
- 第三章磁功能玻璃
- 國家開放大學《機械制造基礎》章節測試題參考答案
- 大學生對美團滿意調查問卷
- 軸承的計算公式
評論
0/150
提交評論