c語言函數, 函數調用及函數遞歸

1. 函數的定義: 返回值類型 函數名(形參列表) {函數體(函數的實現內容)}, 注意: 若是沒有參數, 小括號也是必不可少的.數組

   函數與函數之間能夠嵌套調用(也就是在一個函數內部能夠調用另一個函數), 可是不能嵌套定義(不能在一個函數內部定義另一個函數)xcode

  形參: 形式上的參數, 在函數定義時, 給定的參數叫作形參, 是一個一個的變量, 存儲的數據在調用以前完未知模塊化

  實參: 函數調用時給定的參數叫作實參, 是一個惟一肯定的數據. 實參向形參傳遞的過程是一個拷貝的過程函數

  函數至關於公司的部門, 每個部分完成特定的功能, 部門與部門之間的並列關係決定了函數與函數之間也是並列關係spa

  函數的功能: 實現代碼的模塊化管理. 把複雜的邏輯進行拆分, 而主函數只起到宏觀調控的功能便可, main函數是應用程序執行的入口code

  函數定義過程當中可能出現的錯誤:遞歸

    a. Function definition is not a allowed here: 緣由: 函數內部又定義了一個新的函數, 嵌套定義作用域

     solution:函數之間是並列關係, 把內部定義的函數定義在外部it

    b. Control reaches end of non-void function: 緣由: 返回值不能爲空, 函數內部沒有經過return返回數據io

     solution: 經過return返回對應數據

2. 函數定義形式:

  a. 函數定義第一種形式: 無參數, 無返回值

    void buyMike() {

        printf("還沒給錢\n");

    }

     函數名的命名規範: 有多個英文帶刺組成, 除了第一個單詞的首字母小寫, 其他單詞首字母大寫

  b. 函數定義的第二種形式: 有返回值, 無參數

    float salary() {

        printf("同志們今年乾的不錯, 明年好好幹, 不要跳槽\n");

        return 1.0;//ruturn 將該函數的值返回給主調函數

            //千萬不要把代碼放到return下面, 會執行不到

    }

  c. 函數定義的第三種形式: 無返回值, 有參數

    void buyMike2(float money) {

        if (money < 10) {

            printf("錢不夠\n");

        } else {

            printf("OK, 買了牛奶\n");

        }

    }

  d. 函數定義的第四種形式: 有返回值, 也有參數

    //求兩個數的最大值

    int maxValueOfTwo(int a, int b) {

        return a > b ? a : b;

    }

    //求兩個數的最小值

    int minValueOfTwo(int a, int b) {

        return a < b ? a : b;

    }

    //求三個數的最大值

    int maxOfThreeNumber(int a, int b, int c) {

        //1.先求a與b的最大值max

        //int max = 0;//存儲最大值

        //max = maxValueOfTwo(a, b);

        //2.再求max與c的最大值

        return maxValueOfTwo(maxValueOfTwo(a, b), c);

    }

3.函數調用(讓函數幹活)

  a. 無返回值的函數: 函數名(傳遞的是實參表); 如buyMike2(3.2);

  b. 有返回值的函數: 定義一個和返回值類型對應的變量, 用來接收函數調用返回的值. 如: int max  = maxValue(2, 3);

4. 數組與函數的關係, 數組做爲函數的參數:

  a. 當數組做爲函數參數時, 只傳遞函數名稱如int a[10] = {0}; outputArray(a, 10);//outputArray(int arr[], int n)是本身定義的一個函數

5. 函數的使用分爲三部分:(在xcode中)

  a. 函數聲明, 相似於使用說明書, 寫在.h文件中

  b. 函數定義(函數的實現),實現寫在.m文件中

  c. 函數的調用(導入頭文件, 本質就是將.h文件中的內容所有拷貝到該文件中)

6. 變量的做用域: 變量可訪問的範圍

  局部變量: 在函數內部定義的變量叫作局部變量, 只在函數內部可訪問, 函數執行時開闢空間,  函數執行結束空間自動回收

  全局變量: 在函數外部定義的變量叫作全局變量, 在全局均可訪問, 空間不會回收(warning:全局變量很是危險, 使用需謹慎)

  靜態變量: 凡是被static修飾的變量都叫靜態變量

        特色: 1. 若是不賦初值, 默認爲0

              2. 只初始化一次(該變量只會定義一次)

                3. 空間一旦開闢, 不會回收

7. 函數遞歸: 函數的遞歸是調用一個與本身功能徹底相同的函數(注意: 遞歸必定要有出口, 不然會形成死循環), 如:

  

  //函數模擬吃蘋果

  void eatApple(int n) {

      //一旦發現蘋果個數爲0, 經過return結束當前函數執行  

      //遞歸必定要有出口, 不然會形成死循環

      if (n == 0) {

          return;//返回空

      }

      //若是不爲零

      //1. 留一個蘋果

      n--;

      //2. 找下一我的來吃蘋果

      eatApple(n);

      //3. 吃本身手中的蘋果

      printf("%d我的吃蘋果:\n", 10 - n);

  }

 在main函數中直接進行函數調用便可: eatApple(10);

  //倒序報數54321

  void reverse(int n) {

        if (n == 0) {

            return;

        }

       //1. 留個數

       int m = n % 10;

        //2. 報數

        printf("%d", m);  

        //3. 找下一我的報數

        reverse(n / 10);

  }

  //正序

  void positive(int n) {

      if (n == 0) {

          return;

      }

      //1. 留個數

      int m = n % 10;

      //2. 找下一我的報數

      positive(n / 10);

      //3. 報數

      printf("%d", m);

  }

 

  //階乘

  int fac(int n) {

      if (n == 0 || n == 1) {//01的階乘都爲1

          return 1;

      }

      return n * fac(n - 1);

  }

相關文章
相關標籤/搜索