成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

最強(qiáng)函數(shù)學(xué)習(xí)之路

_Dreams / 3435人閱讀

摘要:無論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時,它們都必須有確定的值,以便把這些值傳送給形參。形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動銷毀了。函數(shù)的聲明一般出現(xiàn)在函數(shù)的使用之前。函數(shù)的聲明一般要放在頭文件中的。

索引

一. 函數(shù)是什么
二. 庫函數(shù)
三. 自定義函數(shù) ?函數(shù)參數(shù)
四 函數(shù)的嵌套調(diào)用和鏈?zhǔn)皆L問
五.函數(shù)的聲明和定義
六.函數(shù)遞歸
一.函數(shù)是什么?
對于我們大部分人而言我們最先是在數(shù)學(xué)中接觸函數(shù),eg:f(x) = x+1;
或者更為復(fù)雜,我們只需要代入一個x的值,然后按照函數(shù)給的模板算就可以了,
其實(shí)在c語言中,我們可以類比數(shù)學(xué)中的函數(shù),只不過這個時候我們只需要輸入很少的參數(shù),
然后編譯過程是編譯器實(shí)現(xiàn)的,但函數(shù)的實(shí)現(xiàn)過程也是我們創(chuàng)造的。
維基百科中對函數(shù)的定義: 子程序
在計(jì)算機(jī)科學(xué)中,子程序(英語:Subroutine, procedure, function, routine, method,
subprogram, callable unit),是一個大型程序中的某部分代碼, 由一個或多個語句塊組
成。它負(fù)責(zé)完成某項(xiàng)特定任務(wù),而且相較于其他代 碼,具備相對的獨(dú)立性。
一般會有輸入?yún)?shù)并有返回值,提供對過程的封裝和細(xì)節(jié)的隱藏。這些代碼通常被集成為軟
件庫。
上述只是很簡單的大致概括了一下函數(shù),下面我將會進(jìn)一步解釋函數(shù)
? ?
C語言中函數(shù)分為兩類:庫函數(shù)和自定義函數(shù)
? ? ? ? ? ?
二.庫函數(shù)
先思考一下問題,什么是庫函數(shù)?為什么要有庫函數(shù)?
1. 我們知道在我們學(xué)習(xí) C 語言編程的時候,總是在一個代碼編寫完成之后迫不及待的想知道結(jié)果,想
把這個結(jié)果打印到我們的屏幕上看看。這個時候我們會頻繁的使用一個功能:將信息按照一定的格
式打印到屏幕上( printf )。
2. 在編程的過程中我們會頻繁的做一些字符串的拷貝工作( strcpy )。
3. 在編程是我們也計(jì)算,總是會計(jì)算 n k 次方這樣的運(yùn)算( pow )。
像上面我們描述的基礎(chǔ)功能,它們不是業(yè)務(wù)性的代碼。我們在開發(fā)的過程中每個程序員都可能用的到,
為了支持可移植性和提高程序的效率,所以 C 語言的基礎(chǔ)庫中提供了一系列類似的庫函數(shù),方便程序員
進(jìn)行軟件開發(fā)。
我們平時使用過程中直接一個printf表示打印到屏幕上,實(shí)際上實(shí)現(xiàn)這個過程要極其復(fù)雜的函數(shù),下面是vs上面實(shí)現(xiàn)printf功能的部分截圖

想一下,如果沒有庫函數(shù),那么每個程序員的printf實(shí)現(xiàn)都是不一樣的 ,那么平臺的可移植性就等于0,因此,對于經(jīng)常用到的某些函數(shù)功能,在C語言基礎(chǔ)庫中添加了這些功能實(shí)現(xiàn)的函數(shù),因此被叫做庫函數(shù),大家都可以用。
那么問題來了,庫函數(shù)該如何學(xué)習(xí)呢?
這邊介紹一個網(wǎng)站? ? ? www.cplusplus.com
這是一個外國網(wǎng)站 做的還是比較好的? strcpy 這個函數(shù)我們現(xiàn)在嘗試在這個網(wǎng)站上學(xué)習(xí)這個函數(shù)

?我輸入strcpy后

在前面加一個頭文件,不然無法使用strcpy
#include#includeint main() {	char arr2[] = "zhangdashuai";	char arr1[30];	char arr[40];	strcpy(arr1, arr2);	strcpy(arr, "zhangdasa");	printf("%s/n%s", arr1, arr);	return 0;}

?如果有小伙伴英文是在看不懂,這邊還有一個中文版的網(wǎng)站

http://zh.cppreference.com (中文版)
注:
但是庫函數(shù)必須知道的一個秘密就是:使用庫函數(shù),必須包含 #include 對應(yīng)的頭文件。
這里對照文檔來學(xué)習(xí)上面幾個庫函數(shù),目的是掌握庫函數(shù)的使用方法。
. ? 自定義函數(shù)
如果庫函數(shù)能干所有的事情,那還要程序員干什么?
所有更加重要的是 自定義函數(shù) 。
自定義函數(shù)和庫函數(shù)一樣,有函數(shù)名,返回值類型和函數(shù)參數(shù)。
但是不一樣的是這些都是我們自己來設(shè)計(jì)。這給程序員一個很大的發(fā)揮空間。
函數(shù)的組成:
ret_type fun_name ( para1 , * )
{
statement ; // 語句項(xiàng)
}
ret_type 返回類型
fun_name 函數(shù)名
para1 ? ? 函數(shù)參數(shù)
首先,思考一下,每個函數(shù)都必須要有返回值嗎?
不一定,如果返回類型是void就不用有返回值,



void

void declarator

When used as a function return type, the void keyword specifies that the function does not return a value

但是其他的如果函數(shù)返回類型是int? float 類型的 ,那么在最后就必須加上return 相應(yīng)的類型數(shù)字。

eg:這個menu函數(shù)只是為了打印出我想要的菜單,不需要返回某個值

void menu () {	printf("###################");	printf("####1.play#########");	printf("####0.noplay#######");	printf("###################");}
返回值:
一個加法函數(shù)
#includeint Add(int x, int y) {	return x + y;}int main() {	int a = 8;	int b = 9;	int c = Add(a, b);	printf("%d/n", c);	return 0;}

函數(shù)名的話,就是根據(jù)我們想要函數(shù)實(shí)現(xiàn)的功能,大致翻譯成英文即可。

參數(shù),接下來我通過一個代碼例子闡述參數(shù)的概念——

我現(xiàn)在想創(chuàng)造一個函數(shù),它可以把我穿進(jìn)去的數(shù)字互換一下,,假設(shè)我穿進(jìn)去a=10,b=20,

那么作用使得a=20,b=10;

上代碼

#includevoid swap(int x, int y) {	int tam = x;	x = y;	y = tam;}int main() {	int a = 10;	int b = 20;	printf("a=%d b=%d/n", a, b);	swap(a, b);	printf("a=%d b=%d/n", a, b);	return 0;}

???

函數(shù)好像跟根本沒起作用,為什么???

我們要養(yǎng)成一個好習(xí)慣,拒絕伸手黨,去vs調(diào)試一下

?我們可以看到,雖然x,y的值跟a,b相等

但是發(fā)現(xiàn)他們的地址根本不一樣???

為什么?

引入?yún)?shù)的概念

? 實(shí)際參數(shù)(實(shí)參):
真實(shí)傳給函數(shù)的參數(shù),叫實(shí)參。
實(shí)參可以是:常量、變量、表達(dá)式、函數(shù)等。
無論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時,它們都必須有確定的值,以便把這些值傳送給形
參。
? 形式參數(shù)(形參):
形式參數(shù)是指函數(shù)名后括號中的變量,因?yàn)樾问絽?shù)只有在函數(shù)被調(diào)用的過程中才實(shí)例化(分配內(nèi)
存單
元),所以叫形式參數(shù)。形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動銷毀了。因此形式參數(shù)只在函數(shù)中有
效。

我們的a,b是實(shí)參,x,y是形參,我們通過形參想改變實(shí)參的關(guān)系,結(jié)果證明我們光傳遞值是不可以的,因?yàn)閭魅雽?shí)參后,形參還會開辟一個新的空間,我是這樣理解的

形參實(shí)例化之后其實(shí)相當(dāng)于實(shí)參的一份臨時拷貝 。當(dāng)這個函數(shù)運(yùn)行完后這個形參變回銷毀了,不會對實(shí)參產(chǎn)生什么影響。
我們調(diào)試后可以知道,他們只是地址不一樣,那么我們用指針傳遞地址是不是可以呢?
上代碼:
void swap(int* x, int* y) {	int tam = *x;	*x = *y;	*y = tam;}#includeint main() {	int a = 10;	int b = 20;	printf("a=%d b=%d/n", a, b);	swap(&a, &b);	printf("a=%d b=%d/n", a, b);	return 0;}

??我們再調(diào)試一下

發(fā)現(xiàn)現(xiàn)在x,y的地址和a,b地址相同

這個時候我們通過形參便可以改變實(shí)參的關(guān)系了。

這個時候可能會有疑問,之前我們的Add加法函數(shù)也是是傳值調(diào)用,為什么還能達(dá)到相同的目的呢?第二個swap函數(shù)的傳值調(diào)用為什么不行呢?

我是這樣理解的,有return返回值的時候,傳值調(diào)用和傳值調(diào)用都可以,但是當(dāng)沒有return返回值,只是執(zhí)行函數(shù)里面的內(nèi)容是,只有在傳址調(diào)用時才可以。

我們應(yīng)該區(qū)分出傳值調(diào)用和傳址調(diào)用。

總結(jié)

傳值調(diào)用
函數(shù)的形參和實(shí)參分別占有不同內(nèi)存塊,對形參的修改不會影響實(shí)參。
傳址調(diào)用
傳址調(diào)用是把函數(shù)外部創(chuàng)建變量的內(nèi)存地址傳遞給函數(shù)參數(shù)的一種調(diào)用函數(shù)的方式。
這種傳參方式可以讓函數(shù)和函數(shù)外邊的變量建立起真正的聯(lián)系,也就是函數(shù)內(nèi)部可以直接操
作函數(shù)外部的變量。

四.?函數(shù)的嵌套調(diào)用和鏈?zhǔn)皆L問

函數(shù)的嵌套調(diào)用就是一個函數(shù)里面可以包含使用另外一個函數(shù)

eg:

void first() {	printf("hhe");}void seond() {	printf("hdg");	first();}

注*函數(shù)可以嵌套調(diào)用,但是不能嵌套定義

eg:

void first() {	printf("hhe");void first() {	printf("hdg");	first();}}

這樣便是錯誤的

鏈?zhǔn)皆L問
把一個函數(shù)的返回值作為另外一個函數(shù)的參數(shù)
這個也很簡單
eg:
int Add(int x, int y) {	return x + y;}#includeint main() {	int a = 10;	int b = 20;	int c = Add(Add(a, b), b);	printf("%d/n", c);	return 0;}

五.函數(shù)的聲明和定義

函數(shù)聲明:
1. 告訴編譯器有一個函數(shù)叫什么,參數(shù)是什么,返回類型是什么。但是具體是不是存在,函數(shù)
聲明決定不了。
2. 函數(shù)的聲明一般出現(xiàn)在函數(shù)的使用之前。要滿足 先聲明后使用 。
3. 函數(shù)的聲明一般要放在頭文件中的。
函數(shù)定義:
函數(shù)的定義是指函數(shù)的具體實(shí)現(xiàn),交待函數(shù)的功能實(shí)現(xiàn)。
簡而言之? ??
int? Add()這個是聲明,然后后面括號里面具體函數(shù)是怎么實(shí)現(xiàn)的就是定義
六.函數(shù)的遞歸
什么是遞歸?
程序調(diào)用自身的編程技巧稱為遞歸( recursion )。
遞歸做為一種算法在程序設(shè)計(jì)語言中廣泛應(yīng)用。 一個過程或函數(shù)在其定義或說明中有直接或間接
調(diào)用自身的
一種方法,它通常把一個大型復(fù)雜的問題層層轉(zhuǎn)化為一個與原問題相似的規(guī)模較小的問題來求解,
遞歸策略
只需少量的程序就可描述出解題過程所需要的多次重復(fù)計(jì)算,大大地減少了程序的代碼量。
遞歸的主要思考方式在于:把大事化小
可能大家不能很好的理解
我舉一例子? eg? 現(xiàn)要求輸入一個數(shù)字為1234? 我們要在電腦屏幕上一次打印1 2 3 4?
要知道如果是打印4 3 2 1 ,那就很簡單了
直接一個循環(huán) 先模10 再除10。
思考一下,遞歸的主要思想是把大事化小,可以這樣化,1234 = 123(4)=12(3)(4)
類推,有人可能認(rèn)為,那還不是依次打印4 3 2 1 嘛
非也非也, 上代碼:
void Printf(int x) {	if (x > 9) {		Printf(x / 10);	}	printf("%d ", x % 10);}#includeint main( ){	int m = 0;	scanf("%d", &m);	Printf(m);	return 0;}

?可以觀察到,為什么呢?????

?因?yàn)閯傞_始必須全部完成if語句里面的,完成if后才會編譯后面的代碼,然后if語句里面全都是Printf函數(shù),所以就一直傳遞,最后不滿足條件是才會退出來,然后開始返回,也就是歸。

觀察我上面的代碼可以發(fā)現(xiàn),遞歸有限制條件,不妨花點(diǎn)時間思考一下?

遞歸的兩個必要條件
存在限制條件,當(dāng)滿足這個限制條件的時候,遞歸便不再繼續(xù)。
每次遞歸調(diào)用之后越來越接近這個限制條件

如果這兩個條件有一個不滿足,會發(fā)生什么呢??——棧溢出

這個名詞也許你不太熟悉,

?這是電腦中粗存空間的區(qū)域名稱,而我們在遞歸中每調(diào)用一次函數(shù),便會在棧區(qū)開辟一塊空間,如果允許計(jì)算機(jī)一直開辟空間的話,那么區(qū)域便會裝不下,這樣的話學(xué)術(shù)人員便為這個取了一個名字——棧溢出。

我們試試棧溢出的情況

void Printf(int x) {	Printf(x / 10);			}#includeint main( ){	int m = 20;	Printf(m);	return 0;}       

?

遞歸先簡單介紹到這,稍后博主會在這兩天仔細(xì)剖析一下遞歸!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/123193.html

相關(guān)文章

  • runc容器逃逸漏洞最強(qiáng)后續(xù):應(yīng)對之策匯總與熱點(diǎn)疑問解答

    摘要:年月日,研究人員通過郵件列表披露了容器逃逸漏洞的詳情,根據(jù)的規(guī)定會在天后也就是年月日公開。在號當(dāng)天已通過公眾號文章詳細(xì)分析了漏洞詳情和用戶的應(yīng)對之策。 美國時間2019年2月11日晚,runc通過oss-security郵件列表披露了runc容器逃逸漏洞CVE-2019-5736的詳情。runc是Docker、CRI-O、Containerd、Kubernetes等底層的容器運(yùn)行時,此...

    PingCAP 評論0 收藏0
  • 架構(gòu)師之路

    摘要:因?yàn)橛脩舨挥迷诘谝淮芜M(jìn)入應(yīng)用時下載所有代碼,用戶能更快的看到頁面并與之交互。譯高階函數(shù)利用和來編寫更易維護(hù)的代碼高階函數(shù)可以幫助你增強(qiáng)你的,讓你的代碼更具有聲明性。知道什么時候和怎樣使用高階函數(shù)是至關(guān)重要的。 Vue 折騰記 - (10) 給axios做個挺靠譜的封裝(報(bào)錯,鑒權(quán),跳轉(zhuǎn),攔截,提示) 稍微改改都能直接拿來用~~~喲吼吼,喲吼吼..... 如何無痛降低 if else 面...

    NikoManiac 評論0 收藏0
  • 從小白程序員一路晉升為大廠高級技術(shù)專家我看過哪些書籍?(建議收藏)

    摘要:大家好,我是冰河有句話叫做投資啥都不如投資自己的回報(bào)率高。馬上就十一國慶假期了,給小伙伴們分享下,從小白程序員到大廠高級技術(shù)專家我看過哪些技術(shù)類書籍。 大家好,我是...

    sf_wangchong 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<