【輕松學 C:編程小白的大冒險】— 16 函數的定義與調用

在這里插入圖片描述

  • 在編程的藝術世界里,代碼和靈感需要尋找到最佳的交融點,才能打造出令人為之驚嘆的作品。
  • 而在這座秋知葉i博客的殿堂里,我們將共同追尋這種完美結合,為未來的世界留下屬于我們的獨特印記。

【輕松學 C:編程小白的大冒險】— 16 函數的定義與調用

  • 一、函數:把代碼變成“樂高積木”的魔法
  • 二、函數定義:打造你的專屬“代碼黑匣子”
    • 2.1 函數的“出廠說明書”長啥樣?
    • 2.2 三要素詳解:每個零件都有大作用
      • ① 返回值類型:函數的“快遞回執”
      • ② 函數名:函數的“戶口本姓名”
      • ③ 參數列表:函數的“食材采購清單”
  • 三、函數調用:讓“代碼機器人”動起來的三種姿勢
    • 3.1 直接調用:適合“干完就走”的void函數
    • 3.2 賦值調用:適合有返回值的函數
    • 3.3 表達式調用:讓函數參與數學運算
    • 3.4 參數傳遞原理:值傳遞的“影分身魔法”
  • 四、實戰案例:用函數搭建“智能奶茶店系統”
    • 4.1 函數化拆分:把大問題拆成小零件
      • ① 杯型轉容量函數
      • ② 加料計價函數
    • 4.2 主函數組裝:調用函數生成訂單
  • 五、💡 函數使用避坑小課堂:新手必看!
    • 5.1 返回值失蹤案:忘記寫return
    • 5.2 參數類型穿越劇:實參與形參不匹配
    • 5.3 函數聲明失蹤案:先調用后定義
    • 5.4 致命錯誤:錯誤的main函數返回類型
  • 六、編程冷笑話:函數的“內心OS”
  • 七、? 今日金句


  • “函數在手,代碼我有!”—— 來自一位成功封裝了起床鬧鐘函數的程序員

一、函數:把代碼變成“樂高積木”的魔法

  • 你有沒有過這樣的經歷?
  • 寫代碼時重復寫了十遍“計算圓周長”的公式,改一個參數卻漏掉三個地方,最后對著報錯信息抓耳撓腮?🤯
  • 別慌!編程界早就發明了“偷懶神器”——函數
  • 它就像代碼世界的“樂高積木”,把重復的邏輯封裝成一個個獨立模塊,想用的時候直接“拼”起來就行
  • 再也不用像流水線工人一樣重復搬磚啦!

二、函數定義:打造你的專屬“代碼黑匣子”

2.1 函數的“出廠說明書”長啥樣?

  • 先來看函數的標準定義格式,一目了然👇
返回值類型
函數名
參數列表
形參1
形參2
...
函數體
執行語句
是否有返回值?
return 結果
void無返回值
  • 翻譯成人類語言就是:
返回值類型 函數名(參數1類型 參數1名稱, 參數2類型 參數2名稱) {在這里寫具體要執行的操作(比如計算、打印);如果有返回值,必須用return語句把結果“吐”出來;
}
  • 特別注意:C語言規定,main函數必須是整個程序的“入口函數”,它的返回值類型必須是int
  • 就像餐廳的大門必須有明確的“入口”標識,這是程序與操作系統對話的“官方接口”。

2.2 三要素詳解:每個零件都有大作用

① 返回值類型:函數的“快遞回執”

  • int:返回整數,精準到個位,像你的年齡(比如返回兩數之和return a + b;)。
  • float/double:返回帶小數的數,允許有誤差,像體重秤的讀數(比如返回圓面積return 3.14 * r * r;)。
  • void:“啥也不返”型,像發消息“已讀不回”,執行完就完事(比如打印日志的函數void print_log() { ... })。
  • 特殊場景main函數的return 0是程序向操作系統發送的“完工報告”,0表示“程序正常結束”,就像快遞員送達后在系統里標記“簽收成功”,操作系統會根據這個數字判斷程序是否順利跑完。

② 函數名:函數的“戶口本姓名”

  • 命名規則比給娃取名字還嚴格,必須遵守“編程界Naming公約”:
正確示范反面教材為啥不行?
calc_average123_avg不能以數字開頭,像“123號同學”難記
get_user_namegn太簡略!別人看不懂是干啥的
check_logincheckLogin拼音+英文混搭?編程界不接受“中英混血”

③ 參數列表:函數的“食材采購清單”

  • 形參(形式參數):函數定義時的“Placeholder”,相當于劇本里的角色名(比如“主角A”“配角B”),只說明“我需要菜名和辣度”,但沒說具體是啥。可以理解為函數的“臨時變量”,調用時才會被賦值,就像拍戲時演員給角色賦予具體形象。
  • 實參(實際參數):調用函數時的“真材實料”,比如cook("火鍋", 5),直接告訴函數“我要做5級辣的火鍋”!

三、函數調用:讓“代碼機器人”動起來的三種姿勢

3.1 直接調用:適合“干完就走”的void函數

  • 比如定義一個“打招呼”函數,直接喊它名字就行,無需接收返回值:
void say_hi() {printf("Hi, I'm your function!\n");
}int main() {say_hi(); // 直接調用,函數會打印一句話,就像喊一聲“幫我打招呼”,不用等回復return 0; // 程序跑完了,向操作系統報告“一切正常”,就像考試結束交卷時寫上“考生已答完”
}

3.2 賦值調用:適合有返回值的函數

  • 把函數的返回值存到變量里,就像把外賣放進你的飯盒:
int add(int a, int b) { // 加法函數,返回a+b的結果return a + b;
}int main() {int result = add(3, 5); // 調用函數并賦值給result,相當于讓函數當“計算器”,算完把結果遞給你printf("3+5=%d\n", result); // 輸出8return 0; // 帶著計算結果“交差”,告訴系統“任務完成,結果正確”
}

3.3 表達式調用:讓函數參與數學運算

  • 函數可以像數字一樣嵌入表達式,比如邊計算邊乘2:
int total = add(10, 20) * 2; // (10+20)*2=60,函數在這里相當于一個“會計算的數字”

3.4 參數傳遞原理:值傳遞的“影分身魔法”

  • 想象你有一張“原圖”變量original,把它傳給函數beauty
void beauty(int photo) { // 形參photo是原圖的“復印件”,就像你把U盤里的文件復制一份給別人,原件還在你手里photo += 100; // 只修改復印件,原圖不變,就像別人在復印件上畫畫,你的原件始終干凈整潔
}int main() {int original = 50;beauty(original); // 實參傳遞的是original的值(50),相當于把文件內容復制一份給函數printf("原圖還是%d分真實!\n", original); // 輸出50,沒變!因為函數拿的是“副本”,改的是“副本”return 0; // 程序確認“原件未被修改”,安心結束
}

畫個“值傳遞流程圖”,秒懂原理👇:

main函數
original = 50
調用 beauty(original)
創建副本 photo = 50
修改 photo = 150
函數返回
original 保持 50

關鍵點:C語言默認是“值傳遞”,函數拿到的是參數的復印件,不會修改原始變量,就像你給朋友的是照片復印件,原件永遠在你相冊里完好無損。


四、實戰案例:用函數搭建“智能奶茶店系統”

  • 假設你要開發一個奶茶店計費系統,需求如下:
  1. 根據杯型(M/L/XL)計算容量
  2. 根據加料(珍珠/椰果/布丁)計算價格
  3. 生成訂單報告

4.1 函數化拆分:把大問題拆成小零件

① 杯型轉容量函數

int get_cup_volume(char size) {switch(size) {case 'M': return 500; // 中杯500mlcase 'L': return 700; // 大杯700mlcase 'XL': return 1000; // 超大杯1000mldefault: return 0; // 防止無效輸入,就像餐廳拒絕“火星杯型”的奇怪訂單}
}

② 加料計價函數

float calculate_topping(int pearl, int coconut, int pudding) {return pearl*1.5 + coconut*2.0 + pudding*3.0; // 珍珠1.5元/份,椰果2元/份,布丁3元/份,精確計算每筆加料費用
}

4.2 主函數組裝:調用函數生成訂單

#include <stdio.h>// 前面定義的兩個函數...int main() {// 顧客點單:大杯(L),2份珍珠,1份椰果char cup_size = 'L';int pearl = 2, coconut = 1, pudding = 0;// 調用函數計算int volume = get_cup_volume(cup_size); // 獲取容量,函數就像“杯型翻譯官”,把L轉成700mlfloat topping_cost = calculate_topping(pearl, coconut, pudding); // 計算加料費,函數是“加料收銀員”float total_price = topping_cost + volume/100.0*5; // 基礎價每100ml 5元,700ml就是7*5=35元,總價=加料費+基礎價// 打印訂單printf("=== 您的奶茶訂單 ===\n");printf("杯型:%c杯(%dml)\n", cup_size, volume);printf("加料:珍珠%d份,椰果%d份\n", pearl, coconut);printf("總價:%.1f元\n", total_price);return 0; // 訂單計算完畢,程序向系統報告“奶茶店系統已完成任務,沒有bug!”,可以安心“下班”啦~
}

運行結果

=== 您的奶茶訂單 ===
杯型:L杯(700ml)
加料:珍珠2份,椰果1份
總價:22.0元

模塊化的好處:如果未來杯型價格調整,只需要修改get_cup_volume一個函數,其他代碼完全不用動,維護成本暴跌!就像奶茶店換了新的杯型模具,只需要改模具設計圖,不用重裝修整個店鋪。

五、💡 函數使用避坑小課堂:新手必看!

5.1 返回值失蹤案:忘記寫return

int calculate(int a, int b) {int result = a * b; // 算完了但沒return!相當于做好了飯卻不端上桌
} // 報錯:缺少返回語句,編譯器大喊:“結果呢?我等著交差呢!”

后果:函數會返回一個隨機垃圾值,就像外賣沒寫地址,不知道會送到哪個“內存小區”,可能導致后續計算出錯,就像用錯誤的配料做奶茶,顧客喝了要投訴!


5.2 參數類型穿越劇:實參與形參不匹配

void heat_water(int temp) { // 形參是int,要求輸入整數溫度printf("加熱到%d度\n", temp);
}heat_water(100.9); // 實參是double,強制截斷為100!小數部分被“截肢”,相當于把100.9℃的水當成100℃加熱

后果:小數部分被“截肢”,實際加熱溫度比預期低,可能導致“奶茶不夠燙”事故,顧客抱怨“這奶茶溫吞吞的!”


5.3 函數聲明失蹤案:先調用后定義

int main() {print_message(); // 調用在定義之前,編譯器不認識!就像你沒介紹朋友,直接喊“這是我兄弟”,別人會一臉懵return 0;
}void print_message() { // 定義在后面,報錯!編譯器說:“沒提前告訴我有這個人,我不認!”printf("Hello from function!\n");
}

解決辦法:在main函數前加一句聲明:void print_message();,相當于提前告訴編譯器“我后面會定義這個函數,先記個名字”,就像提前告訴朋友“等會來個叫小明的,是我哥們”。


5.4 致命錯誤:錯誤的main函數返回類型

void main() { // 嚴重錯誤!C語言不允許void main,這是很多編程教材的“歷史遺留問題”printf("Hello world\n");
}
// ? 正確姿勢:必須返回int
int main() {printf("Hello world\n");return 0; // 標準結尾,缺一不可!就像寫作文必須有開頭和結尾,少了結尾老師要扣分
}

六、編程冷笑話:函數的“內心OS”

  • Q:為什么函數從來不會迷路?
    A:因為它總是被“調用”(call),目標明確,不像指針喜歡到處亂指~

  • Q:為什么void函數最佛系?
    A:它沒有返回值的煩惱,就像程序員遇到“需求待定”時,默默寫代碼不說話~

  • Q:為什么main函數的return 0像晚安問候?
    A:因為它意味著“程序今天的工作結束啦,明天見~”,讓操作系統安心睡覺💤


七、? 今日金句

“函數是代碼世界的‘瑞士軍刀’,
把重復的邏輯磨成鋒利的刀刃,
讓你的代碼像樂高一樣自由拼接,
一個人就能寫出千軍萬馬的氣勢!”
—— 記住,return 0不是隨便寫的結束符,而是程序對世界的溫柔告別:“我已完成使命,一切安好。”

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

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

相關文章

多模態大語言模型arxiv論文略讀(七十四)

UniQA: Unified Vision-Language Pre-training for Image Quality and Aesthetic Assessment ?? 論文標題&#xff1a;UniQA: Unified Vision-Language Pre-training for Image Quality and Aesthetic Assessment ?? 論文作者&#xff1a;Hantao Zhou, Longxiang Tang, Ru…

Flutter - UIKit開發相關指南 - 線程和異步

線程和異步 編寫異步代碼 Dart采用單線程執行模型,支持Isolates(在另一個線程上運行Dart代碼)、事件循環和異步編程。除非生成一個Isolates&#xff0c;否則Dart代碼將在主UI線程中運行&#xff0c;并由事件循環驅動。Flutter的事件循環相當于iOS的主線程上的RunLoop。 Dart…

【愚公系列】《Manus極簡入門》038-數字孿生設計師:“虛實映射師”

&#x1f31f;【技術大咖愚公搬代碼&#xff1a;全棧專家的成長之路&#xff0c;你關注的寶藏博主在這里&#xff01;】&#x1f31f; &#x1f4e3;開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主&#xff01; &#x1f…

西門子WinCC Unified PC的GraphQL使用手冊

TIA V20版本&#xff1a;添加用戶 添加角色&#xff0c;并充分授權&#xff0c;尤其是GraphQL的讀寫權限。 通過SIMATIC Runtime Manager啟動wincc unifi工程。 打開瀏覽器&#xff0c;訪問本地的https://localhost/graphql/&#xff0c;運行正常如圖&#xff1a; 連接外…

開源長期主義:淺談DeepSeek技術主張與早期論文

開源、長期主義與DeepSeek的技術愿景 ©作者|格林 來源|神州問學 導入&#xff1a;Deepseek在早期就開源了許多優秀的指令模型與對話模型&#xff0c;并發布了多篇論文。以下&#xff0c;我們將基于Deepseek在早期發布的6篇論文&#xff0c;來梳理Deepseek公司的技術路徑與…

TTS-Web-Vue系列:Vue3實現內嵌iframe文檔顯示功能

&#x1f5bc;? 本文是TTS-Web-Vue系列的新篇章&#xff0c;重點介紹如何在Vue3項目中優雅地實現內嵌iframe功能&#xff0c;用于加載外部文檔內容。通過Vue3的響應式系統和組件化設計&#xff0c;我們實現了一個功能完善、用戶體驗友好的文檔嵌入方案&#xff0c;包括加載狀態…

Elasticsearch索引設計與調優

一、分片策略設計 1.?分片容量規劃 單分片容量建議30GB(日志場景可放寬至100GB),避免超大分片引發查詢延遲。分片總數計算公式:總數據量 / 30GB 1.2(20%余量應對未來增長)。主分片數創建后不可修改,副本分片數支持動態調整。2.?分片分布優化 PUT logs-2025 { &qu…

Spring AI 集成 Mistral AI:構建高效多語言對話助手的實戰指南

Spring AI 集成 Mistral AI&#xff1a;構建高效多語言對話助手的實戰指南 前言 在人工智能應用開發領域&#xff0c;選擇合適的大語言模型&#xff08;LLM&#xff09;與開發框架至關重要。Mistral AI 憑借其高效的多語言模型&#xff08;如 Mistral-7B、Mixtral-8x7B 等&am…

從新手到高手:全面解析 AI 時代的「魔法咒語」——Prompt

引言&#xff1a;AI 時代的「語言煉金術」 在人工智能技術突飛猛進的今天&#xff0c;我們正在經歷一場堪比工業革命的生產力變革。從聊天機器人到圖像生成&#xff0c;從數據分析到自動化寫作&#xff0c;AI 模型正在重塑人類與信息交互的方式。而在這一切背后&#xff0c;隱…

MySQL 8.0安裝(壓縮包方式)

MySQL 8.0安裝(壓縮包方式) 下載安裝包并解壓 下載 https://dev.mysql.com/downloads/mysql/可關注“后端碼匠”回復“MySQL8”關鍵字獲取 解壓&#xff08;我解壓到D:\dev\mysql-8.4.5-winx64目錄下&#xff09; 創建mysql服務 注意&#xff0c;這步之前一定要保證自己電…

免費Ollama大模型集成系統——Golang

Ollama Free V2 Web 功能實現&#xff1a;界面交互與后端邏輯 一、Web 界面概述 Ollama Free V2 的 Web 界面提供了豐富的交互功能&#xff0c;包括模型選擇、圖片上傳、歷史記錄查看等。界面使用 Bootstrap 進行布局&#xff0c;結合 JavaScript 實現動態交互。 二、前端界…

【AI】人工智能數據標注細分和商業機會

一、數據標注的常見方法 數據標注是為人工智能模型訓練提供高質量標簽的過程&#xff0c;根據數據類型&#xff08;圖像、文本、音頻、視頻等&#xff09;的不同&#xff0c;標注方法也有所差異&#xff1a; 1. 圖像標注 分類標注&#xff1a;為圖像分配類別標簽&#xff08…

lanqiaoOJ 652:一步之遙 ← 擴展歐幾里得定理

【題目來源】 https://www.lanqiao.cn/problems/652/learning/ 【題目背景】 本題為填空題&#xff0c;只需要算出結果后&#xff0c;在代碼中使用輸出語句將所填結果輸出即可。 【題目描述】 從昏迷中醒來&#xff0c;小明發現自己被關在X星球的廢礦車里。礦車停在平直的廢棄…

HTTP / HTTPS 協議

目錄 一、前言&#xff1a; 二、Fiddler 抓包工具&#xff1a; 三、http 協議&#xff1a; 1、http 請求&#xff1a; 1.&#xff08;1&#xff09;請求行&#xff1a; 1、(2) 請求頭&#xff1a; 1、(3) 請求正文: 2、http 響應&#xff1a; 2、(1) 狀態碼&#x…

使用泛型加載保存數據

文章速覽 泛型泛型概述定義優點 實例加載數據保存數據 一個贊&#xff0c;專屬于你的足跡&#xff01; 泛型 泛型概述 泛型&#xff08;Generics&#xff09;是 C# 中一種重要的編程特性&#xff0c;它允許程序員編寫靈活且類型安全的代碼。通過使用泛型&#xff0c;可以創建…

Redis內存淘汰策略和過期鍵刪除策略有哪些?

Redis 提供 8 種內存淘汰策略&#xff0c;以下是詳細解析及場景建議&#xff1a; 一、核心策略解析 noeviction (默認策略) 機制&#xff1a;內存滿時拒絕新寫入操作&#xff0c;返回錯誤優勢&#xff1a;絕對數據安全場景&#xff1a;金融交易系統、醫療數據存儲 allkeys-lr…

【C/C++】自定義類型:結構體

文章目錄 前言自定義類型&#xff1a;結構體1.結構體類型的聲明1.1 結構體回顧1.1.1 結構的聲明 1.1.2 結構體變量的創建和初始化1.2 結構的特殊聲明1.3 結構的自引用 2.結構體內存對齊2.1 對?規則2.2 為什么存在內存對齊&#xff1f;2.3 修改默認對?數 3. 結構體傳參4.結構體…

PPO算法:一種先進的強化學習策略

什么是PPO算法&#xff1f; PPO&#xff08;Proximal Policy Optimization&#xff09;是一種增強學習算法&#xff0c;主要應用于解決連續控制任務。PPO算法在2017年由OpenAI提出&#xff0c;旨在解決傳統策略梯度方法在連續控制任務中面臨的挑戰。PPO算法通過引入一個近似目…

OpenCV實現數字水印的相關函數和示例代碼

OpenCV計算機視覺開發實踐&#xff1a;基于Qt C - 商品搜索 - 京東 實現數字水印的相關函數 用OpenCV來實現數字水印功能&#xff0c;需要使用一些位操作函數&#xff0c;我們需要先了解一下這些函數。 1. bitwise_and函數 bitwise_and函數是OpenCV中的位運算函數之一&…

基于Python的計算機科學研究話題管理系統的設計與實現 - 爬蟲

標題:基于Python的計算機科學研究話題管理系統的設計與實現 - 爬蟲 內容:1.摘要 本文聚焦于基于Python的計算機科學研究話題管理系統的爬蟲部分。背景是隨著計算機科學研究的快速發展&#xff0c;相關話題數據海量且分散&#xff0c;人工管理效率低。目的是設計并實現一個能高…