<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                本文目錄 - [一、基本概念](http://www.cnblogs.com/mjios/archive/2013/06/08/3082932.html#label0) - [二、函數的定義](http://www.cnblogs.com/mjios/archive/2013/06/08/3082932.html#label1) - [三、形式參數和實際參數](http://www.cnblogs.com/mjios/archive/2013/06/08/3082932.html#label2) - [四、返回值類型](http://www.cnblogs.com/mjios/archive/2013/06/08/3082932.html#label3) - [五、return](http://www.cnblogs.com/mjios/archive/2013/06/08/3082932.html#label4) - [六、函數定義的注意](http://www.cnblogs.com/mjios/archive/2013/06/08/3082932.html#label5) - [七、常見函數](http://www.cnblogs.com/mjios/archive/2013/06/08/3082932.html#label6) 前面已經講完了C語言中的基本語句和基本運算了,這講呢,介紹C語言中的重頭戲---函數。其實函數這個概念,在大部分高級語言中都是非常重要的,我也已經在《[第一個C語言程序](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html)》一講中對函數作了一個簡單介紹。 [回到頂部](http://www.cnblogs.com/mjios/archive/2013/06/08/3082932.html#labelTop) ### 一、基本概念 ### 1.什么是函數 任何一個C語言程序都是由一個或者多個程序段(小程序)構成的,每個程序段都有自己的功能,我們一般稱這些程序段為“函數”。所以,你可以說C語言程序是由函數構成的。 比如你用C語言編寫了一個MP3播放器程序,那么它的程序結構如下圖所示: ![](https://box.kancloud.cn/2016-05-07_572d60420e413.png) - 從上圖可以看出:函數就是用來實現某個功能的程序段,每一個函數都有自己的功能。因此,你應該把實現某個功能所需的代碼都寫在函數中。比如,有個函數的功能是播放MP3,那么播放MP3的代碼都應該寫到這個函數中。 - 當調用(執行)一個函數時,計算機就會按順序執行函數中的所有代碼,從而展示函數所實現的功能。 ### 2.函數名 一般來說,我們會將不同的功能交給不同的函數去實現。比如,將暫停播放MP3的代碼寫到一個函數中,將停止播放MP3的代碼寫到另一個函數中。因此,一個C程序中可能會有很多的函數。為了方便調用和區分這些函數,我們需要為每一個函數都起一個唯一的名稱,函數的命名必須按照[標識符](http://www.cnblogs.com/mjios/archive/2013/05/07/3064469.html)命名規則。利用函數名就可以調用到對應的函數。 [回到頂部](http://www.cnblogs.com/mjios/archive/2013/06/08/3082932.html#labelTop) ### 二、函數的定義 ### 1.任何一個函數在使用之前都必須進行定義 定義函數的目的就是為了寫清楚你這個函數是干啥用的,里面包含了哪些代碼。函數的定義格式如下: ~~~ 1 返回值類型 函數名(形式參數列表) 2 { 3 函數體 4 } ~~~ ### 2.舉例 比如定義一個函數用來計算兩個整數的和。那么可以寫成下面這樣: ~~~ 1 #include <stdio.h> 2 3 int sum(int a, int b) 4 { 5 int c = a + b; 6 return c; 7 } 8 9 int main() 10 { 11 int d = sum(10, 11); 12 13 printf("d is %d", d); 14 return 0; 15 } ~~~ - 分別在第3行、第9行定義了sum函數、main函數,其中sum函數的作用是計算兩個整數的和。 - 函數定義好后,并不會馬上執行函數內部的代碼,要有人調用它才會執行內部的代碼。就好像你的手機雖然有打電話的功能,但是只有按了撥號鍵,才會執行打電話的功能。 - 程序運行時就會先調用main函數,按順序執行第11~14行代碼,因為main函數是程序的入口 - 第11行的sum(10, 11)是調用sum函數,sum函數被調用了,就會分配存儲空間給形式參數列表中的所有參數,也就是第3行中的變量a和變量b,它們都是“形式參數” - 第11行中的10、11稱為“實際參數”,它們將分別賦值給變量a、變量b,也就是相當于 ~~~ 1 int a = 10; 2 int b = 11; ~~~ - 既然調用了sum函數,就會按順序執行sum函數中的代碼,也就是第5~6行代碼。 - 第5行將a+b的值21賦值給了變量c,第6行使用return關鍵字將變量c返回給了函數調用者,也是說,第11行sum(10, 11)的值是21。那么變量d的值就是21。 - 第13行的輸出結果為: ~~~ d is 21 ~~~ - 第3~7行中的變量a、b、c都只有在調用sum函數時,才會分配存儲空間,當sum函數執行完畢后,變量a、b、c就會被釋放存儲空間。因此,它們的作用域僅限于sum函數內部。 - 第3行sum左邊的int稱為“返回值類型”,第6行return關鍵字后面跟著的數值稱為“返回值”,因此第6行的變量c就是返回值,返回值的數據類型應該跟“返回值類型”保持一致。 [回到頂部](http://www.cnblogs.com/mjios/archive/2013/06/08/3082932.html#labelTop) ### 三、形式參數和實際參數 ### 1.基本概念 1> 形式參數:在定義函數時,函數名后面的小括號()中定義的變量稱為形式參數,簡稱形參 2> 實際參數:在調用函數時傳入的值稱為實際參數,簡稱實參 ### 2.調用函數時傳遞的實參個數 必須和 函數的形參個數必須保持一致 ~~~ 1 int sum(int a, int b, int c) 2 { 3 return a + b + c; 4 } 5 6 int main() 7 { 8 sum(10, 9, 7); 9 return 0; 10 } ~~~ 第1行中sum函數中有3個形參,因此在第8行調用sum函數時,需要傳入3個實參 ### 3.當使用基本數據類型(char、int、float等)作為實參時,實參和形參之間只是值傳遞,修改形參的值并不影響到實參 ~~~ 1 #include <stdio.h> 2 3 int test(char a) 4 { 5 a = 10; 6 7 return 0; 8 } 9 10 int main() 11 { 12 char b = 5; 13 14 test(b); 15 16 printf("b的值是%d", b); 17 18 return 0; 19 } ~~~ - 在第3行定義了test函數,只有一個形參a - 在第14行調用了test函數,接著就會分配內存給變量a。這里將變量b當做實參,那么變量b的值將傳遞給變量a。這個時候,內存中大致如下圖所示: ![](https://box.kancloud.cn/2016-05-07_572d766a7dad5.png) (其實在內存中存儲的是二進制數據,這里我寫成10進制是為了直觀性) - 執行完第5行代碼后,變量a的值變成了10,但是變量b的值依然是5 ![](https://box.kancloud.cn/2016-05-07_572d766a8e7fc.png) - 第16行代碼的輸出結果是: ~~~ b的值是5 ~~~ 因此,在函數內部修改了形參的值,并不會影響到外面的實參。 ### 4.函數可以沒有形參 定義一個函數時是可以沒有形參的,比如下面的函數 ~~~ 1 #include <stdio.h> 2 3 int test() 4 { 5 printf("調用了test函數"); 6 return 0; 7 } 8 9 int main() 10 { 11 test(); 12 return 0; 13 } ~~~ - 在第3行定義了test函數,可以發現,它的形參列表是空的,也就是沒有形參 - 那么在第11行調用test函數時,就不用傳遞任何實參 - 其實,第9行定義的main函數也是沒有形參的 [回到頂部](http://www.cnblogs.com/mjios/archive/2013/06/08/3082932.html#labelTop) ### 四、返回值類型 ### 1.返回值就是函數調用完后,返回給函數調用者的結果,用return關鍵字進行返回。定義函數時,要指明函數的返回值類型 ~~~ 1 double pi() 2 { 3 return 3.4; 4 } 5 6 int main() 7 { 8 double a = pi(); 9 return 0; 10 } ~~~ - 第1行定義了一個pi函數,返回值類型是double,因此用return返回的數值應該是double類型的,這里返回的是3.14 - 第8行pi函數調用完畢后,函數調用者得到的值就是3.14,因此,變量a的值是3.14 ### 2.一個函數可以沒有返回值,如果沒有返回值,應該用void表示返回值類型 ~~~ 1 #include <stdio.h> 2 3 void test() 4 { 5 printf("調用了test函數"); 6 return; 7 } 8 9 int main() 10 { 11 test(); 12 return 0; 13 } ~~~ - 在第3行定義了一個test函數,它是沒有返回值的,所以第6行的return后面沒有跟上任何數值 - 在第11行調用了test函數 ### 3.如果一個函數沒有返回值,最后面的return語句可以省略 所以,上面的test函數可以簡化成: ~~~ 1 void test() 2 { 3 printf("調用了test函數"); 4 } ~~~ ### 4.如果一個函數沒有明確寫出返回值類型,那么代表這個函數的返回值類型是int ~~~ 1 sum(int a, int b) 2 { 3 return a + b; 4 } ~~~ 可以看到,第1行定義的sum函數沒有明確寫出返回值類型,那么這個sum函數的返回值類型就是int。因此,第3行return后面跟隨的是int類型數據 [回到頂部](http://www.cnblogs.com/mjios/archive/2013/06/08/3082932.html#labelTop) ### 五、return ### 1.return語句可以在函數內部返回一個值給函數調用者 ~~~ 1 int sum(int a, int b) 2 { 3 return a + b; 4 } 5 6 int main() 7 { 8 int c = sum(5, 8); 9 return 0; 10 } ~~~ 第3行使用了return語句,將a+b的值返回給了函數調用者,因此第8行變量c的值是13 ### 2.一個函數內部可以多次使用return語句,使用了return語句后,函數就會馬上停止執行,return語句后面的代碼就不再被執行 ~~~ 1 int max(int a, int b) 2 { 3 if (a>b) 4 { 5 return a; 6 } 7 8 return b; 9 } ~~~ - 這個max函數可以用來求出兩個整數中的最大值 - 如果a大于b,就執行第5行代碼,直接將a返回,函數就會停止執行。也就是說,后面的第8行代碼就不會被執行 - 如果a不大于b,就執行第8行代碼,將b返回 [回到頂部](http://www.cnblogs.com/mjios/archive/2013/06/08/3082932.html#labelTop) ### 六、函數定義的注意 ### 1.函數名不能重復 默認情況下,函數的名字必須唯一。下面的寫法是錯誤的: ~~~ 1 void test(int a) 2 { 3 4 } 5 6 int test() 7 { 8 return 10; 9 } ~~~ 第1、6行定義的函數的名稱都是test,編譯器會直接報錯 ### 2.每一個函數都應該獨立定義,不能嵌套定義 下面的寫法是錯誤的: ~~~ 1 int main() 2 { 3 void test() 4 { 5 6 } 7 8 return 0; 9 } ~~~ 在第3行把test函數定義在了main函數內部,這是錯誤的寫法 [回到頂部](http://www.cnblogs.com/mjios/archive/2013/06/08/3082932.html#labelTop) ### 七、常見函數 ### 1.main函數 從[第一個C語言程序](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html)開始,就認識了這個main函數。main函數是整個C程序的入口,有了main函數,C程序才能運行成功,而且整個C程序中只能有一個main函數。 main函數的簡單定義如下: ~~~ 1 int main() 2 { 3 4 return 0; 5 } ~~~ 它可以沒有形式參數,返回值是int類型。它的返回值用于說明程序的退出狀態:如果返回0,則代表程序正常退出,否則代表程序異常退出 ### 2.printf函數 你可能已經注意到,平時一直在使用的printf其實也是一個函數,這是系統自帶的函數 ~~~ 1 #include <stdio.h> 2 3 int main() 4 { 5 6 printf("我要學習iOS開發"); 7 8 return 0; 9 } ~~~ - 在第6行調用了printf函數,傳入的參數是一個[字符串常量](http://www.cnblogs.com/mjios/archive/2013/05/07/3065522.html):"我要學習iOS開發" - printf函數的作用是在屏幕上輸出內容 - 注意第1行代碼,如果你使用了printf函數,就要加上這一句,至于原因,會在后面的章節詳細介紹
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看