第5章 函式
函式是c程式的基本組織單位。
有關識別符號:
c語言的識別符號一般應遵循如下的命名規則。
1、識別符號必須以字母a或下劃線開頭,其後的可以是字母、下劃線和數字,其他字元不允許出現在識別符號中。
2、識別符號區分大小寫字母;
3、識別符號的長度,c89規定31個字元以內,c99規定63個字元以內;
4、c語言中的大多數關鍵字有特殊意義,不能作為識別符號;
但是,c語言中預先定義了一些識別符號,他們有特定的含義,通常用做固定的庫函式名或預編譯處理中的專門命令。如scanf、printf、sin、define、include等。
c語言允許使用者識別符號與預定義識別符號同名,但這將使這些識別符號失去系統規定的原意。為了避免誤解,建議使用者為識別符號取名時盡量不要與系統預先定義的標準識別符號(如標準函式)同名。
5.1 函式的概念和結構
先來比較兩個概念:過程(procedure)、函式(
function
)。過程與函式都是一組封裝在一起的語句,能實現特定的功能。區別在於過程只進行某種操作,而函式會產生乙個返回值。在c語言中,過程與函式的語法結構類似(在某些語言中是定義語句是不同的)。因此,
c語言中的「過程」可以簡單理解為沒有返回值的函式。
過程語法結構如下:
void《函式名》(《引數》)
函式語法結構如下:
函式原型(又稱為介面)
函式名後面括號中的引數列表告訴編譯器函式要求呼叫者提供幾個引數和其型別(因此函式原型中引數名可省);函式名左邊的資料型別告訴編譯器,函式向呼叫者返回的資料型別。
返回值型別 《函式名》(《引數》)
函式定義不能巢狀,函式呼叫可以巢狀。
函式體中的變數是區域性變數,只能在函式中使用;
函式頭中的引數不能再定義為區域性變數,但作為區域性變數使用;
引數有多個時必須單獨宣告,用逗號分開。不能寫成int x, y這樣的經典錯誤。
下面的過程可以實現小車右**
void littleright(double number1, doublenumber2)
顯然,筆者並不希望「右轉」這個動作有什麼返回值。而在上述過程中,筆者使用了其他過程如digitalwrite()
等。括號中用逗號隔開的是過程的引數。筆者自己定義的過程中也存在引數。引數的數量和資料型別不受限制,不過通常不會很多。
注意,函式的定義不可以巢狀,但函式的呼叫可以巢狀。被呼叫的函式必須在呼叫它的函式之前宣告被呼叫函式的原型:返回值型別 函式名(參數列);
函式的意義在於方便。首先方便了我們實現某種操作。比如乙個小車程式中可能需要多次右轉,有了函式則只需呼叫相應次數並在使用的時候修改引數。而如果複製**然後修改相應變數,工作量大到難以忍受。其次是方便我們修改。更重要的其實是……好看。可讀性是大規模程式需要著重注意的點。
有時候,函式中沒有引數,沒有定義變數,更沒有執行語句。這時候我們就說我們定義了乙個空函式。乙個語法上正確的空函式的返回值型別必須是void。
函式可以自然結束或者使用return語句。顯然,非void函式是不能自然結束的。而void函式可以選擇自然結束或者加return;來結束。
5.2 函式的使用
使用函式時,我們必須知道它的引數個數,型別,引數的順序,以及返回值的型別。
例如:z=pow(x,y);
上面的語句執行之後,z這個變數中儲存的就是x的
y次方的值。
z,x,y
應當都是整形或浮點型。
x若為負數則
y不能為小於1大於
0的數,若x等於
0則y不能小於等於
0。如果單純寫
pow(x,y);
顯然毫無意義。但我們可以寫
printf(「%d」,pow(x,y));(假設
x,y為正整數)來讓螢幕上輸出x的
y次方的值。
我們自己定義的過程和函式與標頭檔案中包含的函式在呼叫的時候沒有不同。
5.3 區域性變數和全域性變數
這個內容應該早點說的。簡單點說,定義在某對{}裡的變數,可以在這對
{}中的
{}中的語句中使用。全域性變數直接定義在函式體外,不在任何一對
{}之內,所以全域性變數可以在任何語句中使用。例如:
#include#includeusing
namespace
std;
int f[40001
];struct
nodee[
20001];
bool cmp(node a,node b)
int find(int x)
intmain()
f[xx]=find(e[i].y);
f[yy]=find(e[i].x);
}cout
<< 0; return0;
}
全域性變數為陣列f和陣列
e(陣列的知識在下一章,總之也是一種資料結構)。在
main
函式中定義了變數
n,m。在迴圈語句中定義了變數
i。那麼
i就只能在那乙個迴圈語句中用。在後面的語句中我重複定義了很多次i。
n,m則可以在整個
main
函式中用。至於f和
e陣列,可以在程式的任意乙個函式中用。浮點型和整型全域性變數的初始值預設為0。
這裡需要提一下變數的儲存類(時間域)和作用域(空間域)
儲存類說明符分為自動儲存類和靜態儲存類。
自動儲存類有auto(只能作用於變數,函式區域性變數和引數)和register(只能用於區域性變數和函式引數)。二者的區別是auto類變數儲存在記憶體內,register類變數儲存在暫存器中。auto通常可省。
靜態儲存類有extern(外部識別符號,全域性變數和函式名)和static(變數和函式名)。二者之後的變數函式開始執行時就存在,但static後定義的變數只能在變數所在的函式中使用,函式退出時儲存數值。
函式訪問之後定義的變數需要用extern宣告,可被多檔案範圍內訪問的變數或函式需要extern宣告。
任何函式之外宣告的識別符號取檔案範圍,這種識別符號可以從宣告處到檔案末尾的任何函式訪問。
c89標準規定乙個函式中所有區域性變數必須集中定義在函式體重第乙個執行語句的前面。
5.4 函式引數的傳遞
在c語言中函式的引數通過值傳遞。所有的形參都是具有規定型別的區域性變數。
5.5 字元型別判斷函式
isdigit():判斷乙個字元是否是數字
islower():判斷乙個字元是否是小寫字母
isalnum():c是否是字母或數字
isalpha():c是否是大寫或者小寫字母
isupper():是否是大寫字母
isxdigit():是否是十六進製制數字
isspace():是否是空白符
toupper():把小寫字母轉換成大寫字母,其他字元不做變化
tolower():把大寫字母轉換成小寫,其他字元不做變化
5.6 遞迴
就是把大問題分解成小問題,對最基礎的問題實現算出答案並儲存,之後根據遞推公式(或其他轉移方式)來推導出後續答案。經典的斐波那契問題和漢諾塔問題就可以用這種方法解決。
量子程式設計法 簡介和導引
量子程式設計法 又稱為 鏈式程式設計法 是本人研究出的一種程式設計模式。其基本原理是將 碎片化及一致性處理,用excel進行 片段的儲存和管理,並生成最終的源 可用於任何程式語言的程式開發,具有簡單 自然 面向文件和跨程式語言的特點。量子程式設計法 001 一種新的程式設計模式 量子程式設計法 00...
c程式設計4
第四章 選擇結構程式設計 1.if語句用來實現兩個分支的選擇結構 2.switch用來實現多分支的選擇結構 if語句的一般表達形式 if表示式語句一 語句二1.if 語句一 2.if 語句一 else語句二 3.if語句一else if語句二else 語句三 else語句n 關係運算子及其優先順序 ...
Unity程式設計標準導引 3 3 Transform
每個遊戲物件 gameobject 其存在於遊戲世界,都有乙個位置 朝向 大小等基本定位資訊 其存於hierarchy面板,也存在與其他gameobject的相對關係,如父子關係 兄弟關係。unity中使用transform來描述和操作這些屬性。transform的字面理解就是 變換 的意思,所有的...