C語言基礎:第10天筆記

內容提要

  • 函數

    • 函數的概述

    • 函數的分類

    • 函數的定義

    • 形參和實參

    • 函數的返回值

函數

函數的概述

  • 函數:實現一定功能的,獨立的代碼模塊,函數是c程序的核心構成模塊,可以說c程序就是由眾多的函數組成,對于函數的使用,一定是先定義,后使用。

  • 使用函數的優勢:

    ①可以通過函數提供給別人使用,也可以使用別人提供的函數,減少代碼量。

    ②借助函數可以減少重復性的的代碼。

    ③實現結構化(模塊化)程序設計思想

    關于結構化設計思想:將大型的任務功能劃分為相互獨立的小型的任務模塊來設計。

  • 函數是C語言程序的基本組成單元:

    C語言程序是由一個或多個函數組成

函數的分類

  • 從函數實現的角度:

    • 庫函數:C語言標準庫實現的并提供使用的函數,比如:scanf() printf() fgets() fputs() strlen()

    • 自定義函數:需要程序員自行實現,開發中大部分函數都是自定義函數

  • 從函數形式的角度:

    • 無參函數:函數調用時,無需傳遞,可有可無返回值,舉例: test1();

    • 有參函數:函數調用時,需要參數傳遞數據,經常需要配套返回值來使用,舉例:printf("%d\n",12);

  • 從函數調用的角度:

    • 主調函數:主動去調用其他函數的函數。(main函數只能作為主調函數)

    • 被調函數:被其他函數調用的函數。

      舉例:

      ?//主調函數int main(){//被調函數printf("hello world\n");}

      很多時候,尤其是對于自定義函數來說,一個函數有可能既是主調函數,又是被調函數。

      ?int fun_b(){printf("hello\n");}?//主調函數int fun_a(){printf("world\n");//被調函數fun_b();}?int main(){//被調函數fun_a();}

      以上案例中,fun_b()來說是主調函數,同時對于main()函數來說,它又是被調函數。

函數的定義

定義

語法:

?[返回類型] 函數名([形參列表]) ? ? ?------函數頭 ?| 函數首部{函數體語句; ? ? ? ? ? ? ? ? ? ------函數體,整個{}包裹的內容包括返回值都屬于函數體,{}不能省略}

函數頭:

  • 返回類型:函數返回值的類型,(返回值是被調函數的主調函數)

  • 函數名:函數的名稱,遵循標識符命名(不能以數字開頭,只能包含字母、數字、下劃線,建議:小寫+下劃線命名,舉例:show_all())

  • 形參列表:用于接收主調函數傳遞的數據,如果有多個參數,使用“,”分隔,且每一個形參都需要指明類型。

小貼士:

形參列表(被調函數):主調函數給被調函數傳遞數據,主調函數 → 被調函數

返回類型(被調函數):被調函數給主調函數返回數據,被調函數 →主調函數

說明:

  • 函數的返回類型:就是返回值的類型,兩個類型可以不同,但是必須能夠進行轉換,舉例:

    ?double fun_a() ? //函數的返回類型是double{return 12; ? //函數返回值是int}

    以上代碼可以理解為:將int類型的12賦值給一個double類型的匿名變量(int → double),此時屬于隱式轉換。

    ?int fun_a() ? //函數的返回類型是double{return 12.5; ? //函數返回值是int}

    案例:

    ??
  • 在C語言中還可以定義無類型(void類型)的函數,這種函數不返回函數值(沒有函數值),只是完成某種功能,舉例:

    ?void test() ? ?//此時這個函數沒有返回值,也就是它的返回值是,return;{printf("hello\n");}?//下面等價于上面void test(){return; ?//一般,這個return是省略不寫的}
  • 在C語言中,函數的返回類型是可以省略的,如果省略,默認返回int,舉例:

    ?//寫法1  main的返回類型是int類型,默認的返回值是0,等價于寫法2main(){...}?//寫法2:main的返回類型是int類型,默認的返回值是0int main(){return 0; ?// 0:邏輯真, -1:邏輯假 ? 支持非0表示}
  • 函數中返回語句的形式為return(表達式)或者return 表達式

    //寫法1
    int main()
    {return(0);
    }//寫法2
    int main()
    {return 0;
    }
    
  • 如果參數列表中有多個形式參數,則它們之間要用","分隔;即使它們的類型相同,在形式參數中只能逐個進行說明,舉例:

    //正確寫法
    int avg(int x, int y, int z)
    {...
    }//錯誤示例
    int avg(int x,y,z)
    {...
    }
  • 如果形參列表中沒有參數,我們可以不寫,也可以用void標識,舉例:

    //寫法1
    int main()
    {...
    }//寫法2
    int main(void)
    {...
    }
案例

案例1

  • 需求:計算1~n之間自然數的階乘

  • 代碼:

    注意:這里計算結果為0是因為數據太大,超過int存儲范圍,數據丟失

案例2

  • 需求:計算一個圓臺兩個面的面積之和。

  • 方案1:自定義一個函數,直接計算兩個圓的面積和

  • 方案2:自定義一個函數,只計算一個圓的面積

  • 代碼:

    /*************************************************************************> File Name:    demo02.c> Author:       > Description:  > Created Time: 2025年03月14日 星期五 14時26分54秒************************************************************************/#include <stdio.h>
    #include <math.h>
    #define PI 3.1415926// 對庫函數
    extern double pow(double x,double y);/*** 定義一個函數,根據半徑計算面積* @param r :半徑* @return 面積*/
    double cicle_area(double r)
    {return PI * pow(r,2.0);//編譯的時候,需要在gcc后面加-lm
    }int main(int argc,char *argv[])
    {// 定義兩個圓半徑和兩個園面積double r1,r2,area1,area2;printf("請輸入兩個圓的半徑\n");scanf("%lf,%lf",&r1,&r2);//計算面積area1 = cicle_area(r1);area2 = cicle_area(r2);//輸出printf("一個園臺兩個面面積之和為:%.2f\n",area1 + area2);return 0;
    }
    

形參和實參

形參(形式參數)

函數定義時指定的參數,形參是用來接收數據的,函數定義時,系統不會為形參申請內存,只有當函數調用時,系統才會為形參申請內存,主要用于存儲實際參數,并且當函數同時(執行return),系統會自動回收為形參申請的內存資源。

案例

  • 需求:判斷奇偶數

  • 代碼:

/**
* 方式1
*/
void fun(int n)
{if(n % 2 == 0){printf("%d是偶數\n",n);}else{printf("%d是奇數\n",n);}
}/**
* 方式2 推薦
*/
void fun(int n)
{if(n % 2 == 0){printf("%d是偶數\n",n);return;//return之后代碼不執行}printf("%d是奇數\n",n);
}/**
* 方式3 推薦
*/
int fun(int n)
{if(n % 2 == 0){printf("%d是偶數\n",n);return -1;//return之后代碼不執行}printf("%d是奇數\n",n);return 0;
}
實參(實際參數)
定義
  • 函數調用時主調函數傳遞的數據參數(字面量、符號常量、表達式...,是要是確定的值),實參就是傳遞的數據。

  • 實參和形參必須類型相同,如果不同時,按賦值規定進行類型轉換,比如隱式轉換。

  • 在C語言中,實參傳遞必須遵循單向傳遞(通過實參給形參賦值),實參只是將自身的值傳遞給了形參,而不是實參本身,形參的值的改變不會影響實參。

    int fun(int n)
    {printf("%d\n",n);
    }int main()
    {int a = 10; // a = 10fun(a); // a是實參,數據10,實參是變量a = 20; //a = 20fun(12);//字面量12就是實參fun(a + 12); //數據量是22 實參是表達式
    }
  • 實參與形參在內存中占據不同的內存空間。

    double fabs(double a)
    {return a < 0 ? -a : a;
    }int main()
    {int x = 12,y = -12;int x1 = (int)fabs(x);  //12int y1 = (int)fabs(y);  //12
    }
案例

案例1:

  • 需求:輸入4個整數,要求用一個函數求出最大數

  • 代碼:

    /*************************************************************************> File Name:    demo03.c> Author:       > Description:  > Created Time: 2025年03月14日 星期五 15時25分32秒************************************************************************/#include <stdio.h>/*** 定義一個函數,求兩個數最大數* @param x,y* @return 最大數*/
    int max(int x, int y)
    {return x > y ? x : y;
    }int main(int argc,char *argv[])
    {int a,b,c,d,max1,max2,max3;printf("輸入4個數\n");scanf("%d%d%d%d",&a,&b,&c,&d);//求abmax1 = max(a,b);//求abcmax2 = max(max1,c);//求abcdmax3 = max(max2,d);printf("%d,%d,%d,%d中最大%d\n",a,b,c,d,max3);return 0;
    }
    

函數的返回值

  • 若不需要返回值,函數可以沒有return語句。

    //如果返回類型是void,return可以省略
    void fun1
    {}//return 可以省略,默認 0
    int fun2()
    {}
    //return 可以省略,默認 0
    fun3()
    {}
  • 一個函數中可以有多個return語句,但任一時刻只有一個return語句被執行

    int eq(int num)
    {if(num % 2 == 0){printf("%d\n",num);return 0;}printf("%d\n",num);return 0;
    }
  • 返回值類型一般情況下要和函數中return語句返回的數據類型一樣,如果不一致,以函數定義時指定的返回值類型為標準。

案例

需求:輸入兩個整數,要求用一個函數求最大數

  • 案例1:

    /*************************************************************************> File Name:    demo04.c> Author:       > Description:  > Created Time: 2025年03月14日 星期五 16時01分54秒************************************************************************/#include <stdio.h>/*** 定一個函數* @param x,y* @return max*/
    int get_max(int x, int y)
    {if (x > y) return x;return y;
    }int main(int argc,char *argv[])
    {int a,b,max;printf("請輸入\n");scanf("%d%d",&a,&b);max = get_max(a,b);printf("%d,%d中最大數是%d\n",a,b,max);return 0;
    }
    

  • 案例2

    /*************************************************************************> File Name:    demo05.c> Author:       > Description:  > Created Time: 2025年03月14日 星期五 16時01分54秒************************************************************************/#include <stdio.h>/*** 定一個函數* @param x,y* @return max*/
    double get_max(int x, int y)
    {if (x > y) return x;return y;
    }int main(int argc,char *argv[])
    {int a,b,max;printf("請輸入\n");scanf("%d%d",&a,&b);max = (int)get_max(a,b);printf("%d,%d中最大數是%d\n",a,b,max);return 0;
    }
    

  • 案例3:

    /*************************************************************************> File Name:    demo06.c> Author:       > Description:  > Created Time: 2025年03月14日 星期五 16時01分54秒************************************************************************/#include <stdio.h>/*** 定一個函數* @param x,y* @return max*/
    double get_max(int x, int y)
    {double z;z = x > y ? x : y;return (int)z;
    }int main(int argc,char *argv[])
    {int a,b,max;printf("請輸入\n");scanf("%d%d",&a,&b);max = get_max(a,b);printf("%d,%d中最大數是%d\n",a,b,max);return 0;
    }
    

    運行結果:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75948.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75948.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75948.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

集成開發環境革新:IntelliJ IDEA與Cursor AI的智能演進

集成開發環境革新&#xff1a;IntelliJ IDEA 與 Cursor AI 的智能演進 集成開發環境&#xff08;IDE&#xff09; 是軟件開發者必不可少的工具。一個優秀的 IDE 不僅能夠幫助編寫和調試代碼&#xff0c;還能集成版本控制和代碼優化等多種功能。如今&#xff0c;隨著人工智能&a…

【Django】教程-1-安裝+創建項目+目錄結構介紹

歡迎關注我&#xff01;后續會更新django教程。一周2-3更&#xff0c;歡迎跟進&#xff0c;本周會更新第一個Demo的單獨一個模塊的增刪改查【Django】教程-4-一個增刪改查的Demo【Django】教程-2-前端-目錄結構介紹【Django】教程-3-數據庫相關介紹 1.項目創建 1.1 安裝 Djan…

智能儀表板DevExpress Dashboard v24.2新版亮點:支持.NET 9

使用DevExpress BI Dashboard&#xff0c;再選擇合適的UI元素&#xff08;圖表、數據透視表、數據卡、計量器、地圖和網格&#xff09;&#xff0c;刪除相應參數、值和序列的數據字段&#xff0c;就可以輕松地為執行主管和商業用戶創建有洞察力、信息豐富的、跨平臺和設備的決策…

北斗導航 | 改進最小二乘殘差法的接收機自主完好性監測算法原理,公式,應用,研究綜述,matlab代碼

改進最小二乘殘差法的接收機自主完好性監測算法研究 摘要 本文針對傳統最小二乘殘差RAIM算法在復雜環境下檢測性能不足的問題,提出了一種基于加權抗差估計的改進算法。通過引入IGGⅢ權函數構建抗差最小二乘模型,結合滑動窗口方差估計和自適應閾值調整機制,顯著提升了算法對…

24、web前端開發之CSS3(一)

CSS3詳細講義 目錄 CSS3簡介CSS3核心特性選擇器盒模型背景與邊框文本樣式顏色與透明度過渡與動畫變換彈性盒布局網格布局媒體查詢多列布局字體與排版裝飾與效果性能優化新特性與兼容性CSS3實踐示例總結 一、CSS3簡介 CSS3&#xff08;Cascading Style Sheets, Level 3&#…

【Git “reset“ 命令詳解】

以下是關于 git reset 命令的完整博客文章內容&#xff1a; 本章目錄: 1. 命令簡介主要用途&#xff1a; 2. 命令的基本語法和用法語法格式&#xff1a;使用場景&#xff1a; 3. 命令的常用選項及參數選項示例&#xff1a;1. 使用 --soft 進行軟重置2. 使用 --mixed 進行混合重…

STM32 IIC通信

目錄 IIC簡介硬件電路連接I2C時序基本單元IIC完整數據幀MPU6050封裝硬件IIC內部電路 IIC簡介 IIC&#xff08;Inter-Integrated Circuit&#xff09;是 IIC Bus 簡稱&#xff0c;中文叫集成電路總線。它是一種串行通信總線&#xff0c;使用多主從架構&#xff0c;由飛利浦公司…

深入解析 TypeScript 核心配置文件 tsconfig.json

什么是 tsconfig.json&#xff1f; tsconfig.json 是 TypeScript 項目的中樞神經系統&#xff0c;它是 TypeScript 編譯器的配置文件&#xff0c;決定了整個項目的編譯規則、模塊解析方式和類型檢查策略。這個 JSON 文件通常位于項目根目錄&#xff0c;是 TypeScript 工程化開…

debug 筆記:llama 3.2 部署bug 之cutlassF: no kernel found to launch!

1 問題描述 按照官方的寫法 import torch from transformers import pipeline import os os.environ["HF_TOKEN"] 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 model_id "meta-llama/Llama-3.2-3B"pipe pipeline("text-generation", modelmode…

使用ZYNQ芯片和LVGL框架實現用戶高刷新UI設計系列教程(第五講)

在上一講我們講解了按鍵回調函數的自定義函數的用法&#xff0c;這一講繼續講解回調函數的另一種用法。 首先我們將上一講做好的按鍵名稱以及自定義回調事件中的按鍵名稱修改&#xff0c;改為默認模式為“open”當點擊按鍵時進入回調函數將按鍵名稱改為“close”&#xff0c;具…

Hyperliquid 遇襲「拔網線」、Polymarket 遭治理攻擊「不作為」,從雙平臺危機看去中心化治理的進化陣痛

作者&#xff1a;Techub 熱點速遞 撰文&#xff1a;Glendon&#xff0c;Techub News 繼 3 月 12 日「Hyperliquid 50 倍杠桿巨鯨」引發的 Hyperliquid 清算事件之后&#xff0c;3 月 26 日 晚間&#xff0c;Hyperliquid 再次遭遇了一場針對其流動性和治理模式的「閃電狙擊」。…

交換機與路由器的區別:深入解析

在構建和維護現代計算機網絡的過程中&#xff0c;交換機和路由器無疑是兩種不可或缺的設備。盡管它們都在數據的傳輸和轉發中扮演著重要角色&#xff0c;但各自的工作原理、應用場景和功能特性卻大相徑庭。本文將從多個角度&#xff0c;結合最新的技術發展和實際應用&#xff0…

自頂向下學習K8S--部署Agones

本文在本人博客&#xff0c;原文地址&#xff1a;http://viogami.tech/index.php/blog/346/ 我是gopher&#xff0c;離不開云原生&#xff0c;自然也逃不了理解docker和K8S這倆。今天抽空想玩下agones&#xff0c;進而對K8S有實踐性的理解。 學一個新事物從底層理論學肯定是最…

藍橋杯省模擬賽 階乘求值

問題描述 給定 n&#xff0c;求 n! 除以 1000000007的余數。 其中 n! 表示 n 的階乘&#xff0c;值為從 1 連乘到 n 的積&#xff0c;即 n!123…n。 輸入格式 輸入一行包含一個整數 n。 輸出格式 輸出一行&#xff0c;包含一個整數&#xff0c;表示答案。 樣例輸入 3樣…

如何在Webpack中配置別名路徑?

如何在Webpack中配置別名路徑&#xff1f; 文章目錄 如何在Webpack中配置別名路徑&#xff1f;1. 引言2. 配置別名路徑的基本原理3. 如何配置別名路徑3.1 基本配置3.2 結合Babel與TypeScript3.2.1 Babel配置3.2.2 TypeScript配置 3.3 適用場景與最佳實踐 4. 調試與常見問題4.1 …

協作機械臂需要加安全墻嗎? 安全墻 光柵 干涉區

安全墻是什么 文章目錄 安全墻是什么簡介1. 物理安全墻1.1 定義&#xff1a;1.2 作用機制&#xff1a;1.3 應用場景&#xff1a; 2. 虛擬安全墻2.2 定義&#xff1a;2.3 作用機制&#xff1a;2.3 應用場景&#xff1a; 3. 安全毛毯3.1 工作原理&#xff1a;3.2 特點3.3 應用場景…

Promise怎么使用,以及它解決了什么問題?

什么是 Promise&#xff1f; Promise 是一種用于處理異步操作的 JavaScript 對象&#xff0c;它代表了一個可能還未完成但將來會完成的操作的結果。Promise 的目的是解決回調函數&#xff08;callback&#xff09;帶來的問題&#xff0c;比如回調地獄&#xff08;callback hel…

光譜范圍與顏色感知的關系

光譜范圍與顏色感知是光學、生理學及技術應用交叉的核心課題&#xff0c;兩者通過波長分布、人眼響應及技術處理共同決定人類對色彩的認知。以下是其關系的系統解析&#xff1a; ?1.基礎原理&#xff1a;光譜范圍與可見光? ?光譜范圍定義?&#xff1a; 電磁波譜中能被特定…

如何讓DeepSeek-R1在內網穩定運行并實現隨時隨地遠程在線調用

前言&#xff1a;最近&#xff0c;國產AI圈里的新星——Deepseek&#xff0c;簡直是火到不行。但是&#xff0c;你是不是已經對那些千篇一律的手機APP和網頁版體驗感到膩味了&#xff1f;別急&#xff0c;今天就帶你解鎖一個超炫的操作&#xff1a;在你的Windows電腦上本地部署…

leetcode33.搜索旋轉排序數組

思路源于 【小白都能聽懂的算法課】【力扣】【Leetcode33】搜索旋轉排序數組 | 二分查找 | 數組 主要是數組旋轉后分為左右兩個升序區間 &#xff0c;如果mid落在左區間并且目標大小也在left-mid中&#xff0c;那么right右縮 class Solution {public int search(int[] nums, i…