目錄
main函數和庫函數
什么是函數
函數定義
函數頭(function header)
1.返回類型(return type)
2.函數名(function name)
3.形參聲明(parameter type list)
函數體(function body)
函數調用
求三個數中的最大數
將函數的返回值作為參數傳遞給函數
?調用其他函數
值傳遞
程序由多個零件組合而成,而函數就是這種“零件”的一個較小單位。接下來我們來學習函數的基本知識。
main函數和庫函數
截至目前為止,我們一直都在的程序格式如下:
#include<stdio.h>int main()
{/*………………*/return 0;
}
藍底字部分稱為main函數,在C語言中是必不可少的,在程序執行時,會執行main函數的主體部分。
main函數中使用了printf、scanf、putchar等眾多函數,由C語言提供的眾多函數稱為庫函數。
什么是函數
所謂函數,來源于數學術語函數(function),具有功能、職責的作用。所以每一個函數,就相當于完成任務的一個工具。
我們可以自己來創建各種函數,這也是我們必須學會的。
printf函數和scanf函數等創建好的函數,即使不知道內容,只要了解其使用方法,也可以輕松使用,就像是一個魔法盒一樣。
要像精通這個魔法盒一樣的函數,需要我們站在函數創建者和使用者雙方的立場上,進行兩種學習
函數的創建方法——函數定義
函數的使用方法——函數調用
函數定義
我們先來學習函數的創建方法,定義一個max2的函數
#include<stdio.h>int max2(int a, int b)
{if(a > b)return a;elsereturn b;
}
這個函數定義有多個部分構成:
函數頭(function header)
該部分表示函數的名稱和格式。實際上稱作函數的臉更合適。
1.返回類型(return type)
函數返回的值——返回值(return value)的類型。該函數的情況下,返回的兩個的是兩個int型數值最大的一個,其類型是int型。
2.函數名(function name)
函數的名稱,從其他零件調用函數時,使用函數名。
3.形參聲明(parameter type list)
小括號擴起來的部分,適用于接收輔助性提示的變量——形式參數的聲明,使用多個參數時用逗號隔開。
函數體(function body)
函數體是復合語句。僅在某個函數中使用的變量,原則上應在該函數中聲明和使用。但要注意不能聲明和形參同名的變量,否則會發生變量名的沖突。
函數調用
我們已經知道了函數的創建方法(函數定義),接下來讓我們學習函數的使用方法(函數調用)。
讓我們先創建一個求最大值的函數并且調用它:
#include<stdio.h>int max2(int a, int b)
{if(a > b)return a;elsereturn b;
}
int main()
{int n1, n2;puts("請輸入兩個整數:");printf("整數1:"); scanf("%d", &n1);printf("整數2:"); scanf("%d", &n2);printf("較大的整數是%d\n", max2 (n1, n2));}
該程序定義了兩個函數max2和main,程序首先執行的是main函數(雖然max2函數定義在main函數之前)。使用函數的過程稱為調用函數。
我們來用圖具體說明在調用函數,程序時怎么執行的:
我們可以說:函數max2,給你兩個值,哪個值最大?
?函數調用的形式是在函數名后面加上小括號,這個小括號稱為函數調用運算符,使用函數調用運算符的表達式稱為函數調用表達式。
1.函數調用運算符括起來的是實參,實參可以有多個,需要用逗號隔開。
2.進行函數調用后,程序的流程將會一下調到該函數處,main函數立刻停止,開始執行max2函數。
3.在被調用的一方,會生成用于形參的變量(在函數定義時形參并不是實際存在的),并賦予實參的值。
4.形參完成初始化后,將會執行函數體,程序在執行時遇到return語句或者是循環體最后的 } ,就會從該函數跳轉到調用函數。return后面的表達式(比如說return b)在回到調用函數main函數時,可以看為給它帶的一個小禮物。
返回值是通過對函數調用表達式進行判定而得到的。
比如a=5,b=6.6,由于函數返回類型時int型,所以得到的判定結果就是int 6
x(arg)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?向函數傳遞實參arg并調用,如果返回值類型不是void,則生成函數x返回的值。 |
關于返回值類型void,我們會在下一節中學到。
函數調用時傳遞的只是參數的值,因此使用的實參既可以是變量也可以是常量。例如:
max (n1, 5)
?另外,實參和形參是兩個不同的東西,因此不用擔心它們名字相同。
接下來我們看下return語句的結構:
函數返回的是表達式的值,不能有兩個。
接下來我們來看看關于max2函數的其他定義的方法:
/*第一種*/
int max2(int a, int b)
{int max;if(a > b)max = a;elsemax = b;return max;
}
/*第二種*/
int max2(int a, int b)
{int max = a;if(b > max)max = b;return max;}
/*第三種*/
int max2(int a, int b)
{return (a > b) ?a : b;//使用了條件運算符
}
在第一種函數和第二種函數,都使用了變量max,像這樣只在某個函數中使用的變量,需要在該函數中進行聲明,但是不能與形參的名字重復,否則會發生變量名的沖突。
求三個數中的最大數
我們學習完函數的定義與聲明后,應該初步會編寫一些簡單的程序了,接下來我們來編寫求三個數中的最大數的值
#include<stdio.h>int max3(int a, int b, int c)
{int max = a;if(b > max) max = b;if(c > max) max = c;return max;
}int main()
{int n1, n2, n3;printf("整數1:"); scanf("%d", &n1);printf("整數2:"); scanf("%d", &n2);printf("整數3:"); scanf("%d", &n3);printf("最大值是%d。\n", max3 (n1, n2, n3 ));return 0;
}
?
將函數的返回值作為參數傳遞給函數
#include<stdio.h>/*返回x的平方*/
int sqr(int x)
{return x * x;
}/*返回x和y的值*/
int diff(int a, int b)
{return (a > b) ?a - b:b - a;
}int main()
{int x, y;puts("請輸入倆個整數:");printf("整數1:"); scanf("%d", &x);printf("整數2:"); scanf("%d", &y);printf("兩個整數的平方差是%d", diff(sqr(x), sqr(y)));return 0;
}
1.該程序中先調用函數sqr,把實參的值傳遞給x,進行平方后得到返回值。
2.再把返回值作為實參傳遞給函數diff中的形參a和b,對該表達式進行判斷后得到返回值
3.最后main函數直接將返回值傳遞給printf函數并顯示。
?調用其他函數
截止到目前為止,我們都是在main函數中調用庫函數或我們自己創建的函數,現在我們來學習在自己創建的函數調用其他函數。
#include<stdio.h>/*返回較大值*/
int max2(int a, int b)
{return (a > b) ? a : b;
}/*返回四個整數中的最大值*/
int max4(int a, int b, int c, int d)
{return max2(max2(a, b), max2(c, d));
}int main()
{int n1, n2, n3, n4;printf("整數1:"); scanf("%d", &n1);printf("整數2:"); scanf("%d", &n2);printf("整數3:"); scanf("%d", &n3);printf("整數4:"); scanf("%d", &n4);printf("最大的整數是%d", max4(n1, n2, n3, n4));return 0;
}
我們來拆解分析下:
1.首先在main函數中調用max4函數,main函數立刻停止,把實參賦值給max4中的形參。
2.然后在max4函數中調用兩次max2函數,第一求a和b中較大數、c和d中較大數第二次調用? ? ?比較它們二者比較后得出的較大數。
3.最后main函數把返回值傳遞給printf函數并顯示。
?通過這個案例,我們可以認為函數就是一個程序的零件,例如想實現顯示功能時,就調用printf函數這個零件。在制作零件的時候,如果有其他方便的零件,我們也可以大量使用。
值傳遞
我們來創建一個計算冪的函數。
#include<stdio.h>/*返回x的n次冪*/
int power(double x, int n)
{int i;double tmp = 1.0;for(i = 1; i <= n; i++){tmp *= x;}return tmp;
}int main()
{double a;int b;printf("求a的b次冪。\n");printf("實數1:"); scanf("%lf", &a);printf("整數2:"); scanf("%d", &b);printf("%.2f的%d次冪是%.2f。\n", a, b, power(a, b));return 0;
}
形參x被賦上實參a的值,形參n被賦上b的值,像這樣通過值來進行參數傳遞的機制稱為值傳遞。
注意
函數間參數的傳遞稱是通過值傳遞進行的。
形參x是實參a的副本,形參n是實參b的副本,所以在調用一方的函數power,即使改變所接受的形參的值,調用的實參也不會受影響。
到此為止,我們已經學習了函數一部分的基礎知識,關于函數部分雖然有些抽象,但不要畏難,多看幾遍書和視頻講解,相信大家都能乘風破浪。