C语言函数的概念
函數(shù)的使用
函數(shù)在使用時(shí)必須帶上括號(hào),有必要的話(huà)還要傳遞參數(shù),函數(shù)的執(zhí)行結(jié)果也可以賦值給其它變量。例如,strcmp() 是一個(gè)用來(lái)比較字符串大小的函數(shù)。
示例
#include <stdio.h> #include <string.h> int main(){char str1[] = "http://www.sougou.com";char str2[] = "http://www.baidu.com";//比較兩個(gè)字符串大小int result = strcmp(str1, str2);printf("str1 - str2 = %d\n", result);return 0; }str1 和 str2 是傳遞給 strcmp() 的參數(shù),strcmp() 的處理結(jié)果賦值給了變量 result。
我們不妨設(shè)想一下,如果沒(méi)有 strcmp() 函數(shù),要想比較兩個(gè)字符串的大小該怎么寫(xiě)呢?請(qǐng)看下面的代碼:
#include <stdio.h> #include <string.h> int main(){char str1[] = "http://www.sougou.com";char str2[] = "http://www.baidu.com";int result, i;//比較兩個(gè)字符串大小for(i=0; (result = str1[i] - str2[i]) == 0; i++){if(str1[i] == '\0' || str2[i] == '\0'){break;}}printf("str1 - str2 = %d\n", result);return 0; }比較字符串大小是常用的功能,一個(gè)程序可能會(huì)用到很多次,如果每次都寫(xiě)這樣一段重復(fù)的代碼,不但費(fèi)時(shí)費(fèi)力、容易出錯(cuò),而且交給別人時(shí)也很麻煩,所以C語(yǔ)言提供了一個(gè)功能,允許我們將常用的代碼以固定的格式封裝(包裝)成一個(gè)獨(dú)立的模塊,只要知道這個(gè)模塊的名字就可以重復(fù)使用它,這個(gè)模塊就叫做函數(shù)(Function)。
函數(shù)的本質(zhì)是一段可以重復(fù)使用的代碼,這段代碼被提前編寫(xiě)好了,放到了指定的文件中,使用時(shí)直接調(diào)取即可。
示例封裝 strcmp() 函數(shù)
#include <stdio.h>//將比較字符串大小的代碼封裝成函數(shù),并命名為strcmp_alias int strcmp_alias(char *s1, char *s2){int i, result;for(i=0; (result = s1[i] - s2[i]) == 0; i++){if(s1[i] == '\0' || s2[i] == '\0'){break;}}return result; }int main(){char str1[] = "http://www.sougou.com";char str2[] = "http://www.baidu.com";char str3[] = "http://www.guge.com";//重復(fù)使用strcmp_alias()函數(shù)int result_1_2 = strcmp_alias(str1, str2);int result_1_3 = strcmp_alias(str1, str3);printf("str1 - str2 = %d\n", result_1_2);printf("str1 - str3 = %d\n", result_1_3);return 0; }為了避免與原有的 strcmp 產(chǎn)生命名沖突,我將新函數(shù)命名為 strcmp_alias。
這是我們自己編寫(xiě)的函數(shù),放在了當(dāng)前源文件中(函數(shù)封裝和函數(shù)使用在同一個(gè)源文件中),所以不需要引入頭文件;而C語(yǔ)言自帶的 strcmp() 放在了其它的源文件中(函數(shù)封裝和函數(shù)使用不在同一個(gè)源文件中),并在 string.h 頭文件中告訴我們?nèi)绾问褂?#xff0c;所以我們必須引入 string.h 頭文件。
我們自己編寫(xiě)的 strcmp_alias() 和原有的 strcmp() 在功能和格式上都是一樣的,只是存放的位置不同,所以一個(gè)需要引入頭文件,一個(gè)不需要引入。
C語(yǔ)言中的函數(shù)和數(shù)學(xué)中的函數(shù)
美國(guó)人將函數(shù)稱(chēng)為“Function”。Function 除了有“函數(shù)”的意思,還有“功能”的意思,中國(guó)人將 Function 譯為“函數(shù)”而不是“功能”,是因?yàn)镃語(yǔ)言中的函數(shù)和數(shù)學(xué)中的函數(shù)在使用形式上有些類(lèi)似,例如:
C語(yǔ)言中有 length = strlen(str)數(shù)學(xué)中有 y = f(x)你看它們是何其相似,都是通過(guò)一定的操作或規(guī)則,由一份數(shù)據(jù)得到另一份數(shù)據(jù)。
不過(guò)從本質(zhì)上看,將 Function 理解為“功能”或許更恰當(dāng),C語(yǔ)言中的函數(shù)往往是獨(dú)立地實(shí)現(xiàn)了某項(xiàng)功能。一個(gè)程序由多個(gè)函數(shù)組成,可以理解為「一個(gè)程序由多個(gè)小的功能疊加而成」。
庫(kù)函數(shù)和自定義函數(shù)
C語(yǔ)言在發(fā)布時(shí)已經(jīng)為我們封裝好了很多函數(shù),它們被分門(mén)別類(lèi)地放到了不同的頭文件中(暫時(shí)先這樣認(rèn)為),使用函數(shù)時(shí)引入對(duì)應(yīng)的頭文件即可。
C語(yǔ)言自帶的函數(shù)稱(chēng)為庫(kù)函數(shù)(Library Function)。庫(kù)(Library)是編程中的一個(gè)基本概念,可以簡(jiǎn)單地認(rèn)為它是一系列函數(shù)的集合,在磁盤(pán)上往往是一個(gè)文件夾。C語(yǔ)言自帶的庫(kù)稱(chēng)為標(biāo)準(zhǔn)庫(kù)(Standard Library),其他公司或個(gè)人開(kāi)發(fā)的庫(kù)稱(chēng)為第三方庫(kù)(Third-Party Library)。
除了庫(kù)函數(shù),我們還可以編寫(xiě)自己的函數(shù),拓展程序的功能。自己編寫(xiě)的函數(shù)稱(chēng)為自定義函數(shù)。自定義函數(shù)和庫(kù)函數(shù)在編寫(xiě)和使用方式上完全相同,只是由不同的機(jī)構(gòu)來(lái)編寫(xiě)。
參數(shù)
函數(shù)的一個(gè)明顯特征就是使用時(shí)帶括號(hào)( ),有必要的話(huà),括號(hào)中還要包含數(shù)據(jù)或變量,稱(chēng)為參數(shù)(Parameter)。
示例
strlen(str1)用來(lái)計(jì)算字符串的長(zhǎng)度,str1就是參數(shù)。puts("今天會(huì)下雨!!!")用來(lái)輸出字符串,"今天會(huì)下雨"就是參數(shù)。返回值
既然函數(shù)可以處理數(shù)據(jù),那就有必要將處理結(jié)果告訴我們,所以很多函數(shù)都有返回值(Return Value)。所謂返回值,就是函數(shù)的執(zhí)行結(jié)果。
示例
char str1[] = "C Language"; int len = strlen(str1);strlen() 的處理結(jié)果是字符串 str1 的長(zhǎng)度,是一個(gè)整數(shù),我們通過(guò) len 變量來(lái)接收。
函數(shù)返回值有固定的數(shù)據(jù)類(lèi)型(int、char、float等),用來(lái)接收返回值的變量類(lèi)型要一致。
如果感覺(jué)不錯(cuò)的話(huà)請(qǐng)點(diǎn)贊喲!!!
總結(jié)
- 上一篇: Java三种随机数生成方法
- 下一篇: 论单线程和多线程