逍遙自在學C語言 | 函數初級到高階解析

2023-06-29 06:00:37

前言

函數是C語言中的基本構建塊之一,它允許我們將程式碼組織成可重用、模組化的單元。

本文將逐步介紹C語言函數的基礎概念、引數傳遞、返回值、遞迴以及行內函式和匿名函數。

一、人物簡介

  • 第一位閃亮登場,有請今後會一直教我們C語言的老師 —— 自在。

  • 第二位上場的是和我們一起學習的小白程式猿 —— 逍遙。

二、基礎概念

  • 函數是一個獨立的程式碼塊,可以接收輸入引數並執行特定任務。

  • 它可以用於執行特定的操作或計算,並可以返回一個值(可選)。

  • 以下是一個簡單的範例:

#include <stdio.h>

// 宣告函數
int addNumbers(int a, int b) {
  int sum = a + b;
  return sum;
}

int main() {
  // 呼叫函數
  int result = addNumbers(3, 4);
  printf("兩數之和:%d\n", result);

  return 0;
}

  • 上述程式碼中,我們宣告了一個名為addNumbers的函數,它接收兩個整數引數並返回它們的和。

  • main函數中,我們呼叫了addNumbers函數,並將結果列印到控制檯上。

  • 執行結果

兩數之和:7

三、引數傳遞

  • 函數可以通過引數接收外部傳入的資料。
  • 在C語言中,有兩種引數傳遞的方式:按值傳遞和按參照傳遞。
  • 程式碼範例
#include <stdio.h>

// 按值傳遞
void incrementByValue(int num) {
  num += 1;
}

// 按參照傳遞
void incrementByReference(int* numPtr) {
  (*numPtr) += 1;
}

int main() {
  int num = 5;

  incrementByValue(num);
  printf("按值傳遞後的值:%d\n", num);

  incrementByReference(&num);
  printf("按參照傳遞後的值:%d\n", num);

  return 0;
}

  • 在上面的範例中,我們定義了兩個函數incrementByValueincrementByReference

  • incrementByValue按值傳遞引數,即在函數內部對引數的修改不會影響到原始變數。

  • incrementByReference按參照傳遞引數,通過傳遞指標的方式,可以在函數內部修改原始變數的值。

  • 執行結果

按值傳遞後的值:5
按參照傳遞後的值:6

四、返回值

函數可以返回一個值,這使得我們可以從函數中獲取計算結果或執行狀態。

#include <stdio.h>

// 返回兩個數中較大的數
int max(int a, int b) {
  if (a > b) {
    return a;
  } else {
    return b;
  }
}

int main() {
  int a = 3;
  int b = 4;

  int maxValue = max(a, b);
  printf("較大的數:%d\n", maxValue);

  return 0;
}

  • 在上述範例中,max函數接收兩個整數引數並返回較大的數。

  • main函數中,我們呼叫max函數,並將結果列印到控制檯上。

  • 執行結果

較大的數:4

五、遞迴函數

  • 遞迴是一種函數呼叫自身的技術。

  • 它在解決一些問題時非常有用,如計算階乘、斐波那契數列等。

  • 程式碼範例

#include <stdio.h>

// 計算階乘
int factorial(int n) {
  if (n == 0 || n == 1) {
    return 1;
  } else {
    return n * factorial(n - 1);
  }
}

int main() {
  int num = 5;
  int result = factorial(num);
  printf("%d的階乘:%d\n", num, result);

  return 0;
}

  • 在上面的範例中,factorial函數使用遞迴的方式計算一個數的階乘。

  • main函數中,我們呼叫factorial函數,並將結果列印到控制檯上。

  • 執行結果

5的階乘:120

六、行內函式

  • 行內函式是一種函數呼叫的優化方式,編譯器會將函數的程式碼直接嵌入到呼叫該函數的地方,而不是通過函數呼叫的方式進行執行。

  • 行內函式的好處是可以減少函數呼叫的開銷,提高程式的執行效率。

  • 使用行內函式可以通過在函數定義前加上關鍵字inline來標識。

  • 程式碼範例

#include <stdio.h>

// 行內函式
inline int square(int num) {
  return num * num;
}

int main() {
  int result = square(5);
  printf("平方:%d\n", result);

  return 0;
}

  • 在上述範例中,我們定義了一個行內函式square,它計算一個數的平方。

  • main函數中,我們呼叫square函數,並將結果列印到控制檯上。

  • 執行結果

平方:25

七、匿名函數

  • C語言本身不直接支援匿名函數,但可以使用函數指標和函數指標結構體來模擬匿名函數的功能。
  • 程式碼範例
#include <stdio.h>

// 匿名函數模擬
typedef int (*Operation)(int, int);

int performOperation(int a, int b, Operation op) {
  return op(a, b);
}

int main() {
  Operation add = [](int a, int b) {
    return a + b;
  };

  int result = performOperation(3, 4, add);
  printf("結果:%d\n", result);

  return 0;
}

  • 在上述範例中,我們使用函數指標結構體Operation來模擬匿名函數。

  • 我們定義了一個匿名函數add,它實現了兩個數的加法運算。然後,我們將add函數作為引數傳遞給performOperation函數,並列印結果到控制檯上。

  • 執行結果

結果:7

小結

通過這篇文章,我們學會了

1、函數的概念,引數傳遞,函數返回值

2、遞迴函數

3、行內函式

4、匿名函數