C語言之函數

目錄

main函數和庫函數

什么是函數

函數定義

函數頭(function header)

1.返回類型(return type)

2.函數名(function name)

3.形參聲明(parameter type list)

函數體(function body)

函數調用

求三個數中的最大數

將函數的返回值作為參數傳遞給函數

?調用其他函數

值傳遞


程序由多個零件組合而成,而函數就是這種“零件”的一個較小單位。接下來我們來學習函數的基本知識。


main函數和庫函數

截至目前為止,我們一直都在的程序格式如下:

#include<stdio.h>int main()
{/*………………*/return 0;
}

藍底字部分稱為main函數,在C語言中是必不可少的,在程序執行時,會執行main函數的主體部分。

main函數中使用了printf、scanf、putchar等眾多函數,由C語言提供的眾多函數稱為庫函數


什么是函數

所謂函數,來源于數學術語函數(function),具有功能、職責的作用。所以每一個函數,就相當于完成任務的一個工具。

我們可以自己來創建各種函數,這也是我們必須學會的。

printf函數和scanf函數等創建好的函數,即使不知道內容,只要了解其使用方法,也可以輕松使用,就像是一個魔法盒一樣。

要像精通這個魔法盒一樣的函數,需要我們站在函數創建者和使用者雙方的立場上,進行兩種學習

函數的創建方法——函數定義

函數的使用方法——函數調用


函數定義

我們先來學習函數的創建方法,定義一個max2的函數

#include<stdio.h>int max2(int a, int b)
{if(a > b)return a;elsereturn b;
}

這個函數定義有多個部分構成:

函數頭(function header)

該部分表示函數的名稱和格式。實際上稱作函數的臉更合適。

1.返回類型(return type)

函數返回的值——返回值(return value)的類型。該函數的情況下,返回的兩個的是兩個int型數值最大的一個,其類型是int型。

2.函數名(function name)

函數的名稱,從其他零件調用函數時,使用函數名。

3.形參聲明(parameter type list)

小括號擴起來的部分,適用于接收輔助性提示的變量——形式參數的聲明,使用多個參數時用逗號隔開。

函數體(function body)

函數體是復合語句。僅在某個函數中使用的變量,原則上應在該函數中聲明和使用。但要注意不能聲明和形參同名的變量,否則會發生變量名的沖突。


函數調用

我們已經知道了函數的創建方法(函數定義),接下來讓我們學習函數的使用方法(函數調用)。

讓我們先創建一個求最大值的函數并且調用它:

#include<stdio.h>int max2(int a, int b)
{if(a > b)return a;elsereturn b;
}
int main()
{int n1, n2;puts("請輸入兩個整數:");printf("整數1:");    scanf("%d", &n1);printf("整數2:");    scanf("%d", &n2);printf("較大的整數是%d\n", max2 (n1, n2));}

該程序定義了兩個函數max2和main,程序首先執行的是main函數(雖然max2函數定義在main函數之前)。使用函數的過程稱為調用函數。

我們來用圖具體說明在調用函數,程序時怎么執行的:

我們可以說:函數max2,給你兩個值,哪個值最大?

?函數調用的形式是在函數名后面加上小括號,這個小括號稱為函數調用運算符,使用函數調用運算符的表達式稱為函數調用表達式

1.函數調用運算符括起來的是實參,實參可以有多個,需要用逗號隔開。

2.進行函數調用后,程序的流程將會一下調到該函數處,main函數立刻停止,開始執行max2函數。

3.在被調用的一方,會生成用于形參的變量(在函數定義時形參并不是實際存在的),并賦予實參的值。

4.形參完成初始化后,將會執行函數體,程序在執行時遇到return語句或者是循環體最后的 } ,就會從該函數跳轉到調用函數。return后面的表達式(比如說return b)在回到調用函數main函數時,可以看為給它帶的一個小禮物。

返回值是通過對函數調用表達式進行判定而得到的。

比如a=5,b=6.6,由于函數返回類型時int型,所以得到的判定結果就是int 6

函數調用運算符
x(arg)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?向函數傳遞實參arg并調用,如果返回值類型不是void,則生成函數x返回的值。

關于返回值類型void,我們會在下一節中學到。

函數調用時傳遞的只是參數的值,因此使用的實參既可以是變量也可以是常量。例如:

max (n1, 5)

?另外,實參和形參是兩個不同的東西,因此不用擔心它們名字相同。

接下來我們看下return語句的結構:

函數返回的是表達式的值,不能有兩個。

接下來我們來看看關于max2函數的其他定義的方法:

/*第一種*/
int max2(int a, int b)
{int max;if(a > b)max = a;elsemax = b;return max;
}

/*第二種*/
int max2(int a, int b)
{int max = a;if(b > max)max = b;return max;}

/*第三種*/
int max2(int a, int b)
{return (a > b) ?a : b;//使用了條件運算符
}

在第一種函數和第二種函數,都使用了變量max,像這樣只在某個函數中使用的變量,需要在該函數中進行聲明,但是不能與形參的名字重復,否則會發生變量名的沖突。


求三個數中的最大數

我們學習完函數的定義與聲明后,應該初步會編寫一些簡單的程序了,接下來我們來編寫求三個數中的最大數的值

#include<stdio.h>int max3(int a, int b, int c)
{int max = a;if(b > max) max = b;if(c > max) max = c;return max;
}int main()
{int n1, n2, n3;printf("整數1:"); scanf("%d", &n1);printf("整數2:"); scanf("%d", &n2);printf("整數3:"); scanf("%d", &n3);printf("最大值是%d。\n", max3 (n1, n2, n3 ));return 0;
}

?

將函數的返回值作為參數傳遞給函數

#include<stdio.h>/*返回x的平方*/
int sqr(int x)
{return x * x;
}/*返回x和y的值*/
int diff(int a, int b)
{return (a > b) ?a - b:b - a;
}int main()
{int x, y;puts("請輸入倆個整數:");printf("整數1:"); scanf("%d", &x);printf("整數2:"); scanf("%d", &y);printf("兩個整數的平方差是%d", diff(sqr(x), sqr(y)));return 0;
}

1.該程序中先調用函數sqr,把實參的值傳遞給x,進行平方后得到返回值。

2.再把返回值作為實參傳遞給函數diff中的形參a和b,對該表達式進行判斷后得到返回值

3.最后main函數直接將返回值傳遞給printf函數并顯示。


?調用其他函數

截止到目前為止,我們都是在main函數中調用庫函數或我們自己創建的函數,現在我們來學習在自己創建的函數調用其他函數。

#include<stdio.h>/*返回較大值*/
int max2(int a, int b)
{return (a > b) ? a : b;
}/*返回四個整數中的最大值*/
int max4(int a, int b, int c, int d)
{return max2(max2(a, b), max2(c, d));
}int main()
{int n1, n2, n3, n4;printf("整數1:"); scanf("%d", &n1);printf("整數2:"); scanf("%d", &n2);printf("整數3:"); scanf("%d", &n3);printf("整數4:"); scanf("%d", &n4);printf("最大的整數是%d", max4(n1, n2, n3, n4));return 0;
}

我們來拆解分析下:

1.首先在main函數中調用max4函數,main函數立刻停止,把實參賦值給max4中的形參。

2.然后在max4函數中調用兩次max2函數,第一求a和b中較大數、c和d中較大數第二次調用? ? ?比較它們二者比較后得出的較大數。

3.最后main函數把返回值傳遞給printf函數并顯示。

?通過這個案例,我們可以認為函數就是一個程序的零件,例如想實現顯示功能時,就調用printf函數這個零件。在制作零件的時候,如果有其他方便的零件,我們也可以大量使用。


值傳遞

我們來創建一個計算冪的函數。

#include<stdio.h>/*返回x的n次冪*/
int power(double x, int n)
{int i;double tmp = 1.0;for(i = 1; i <= n; i++){tmp *= x;}return tmp;
}int main()
{double a;int b;printf("求a的b次冪。\n");printf("實數1:"); scanf("%lf", &a);printf("整數2:"); scanf("%d", &b);printf("%.2f的%d次冪是%.2f。\n", a, b, power(a, b));return 0;
}

形參x被賦上實參a的值,形參n被賦上b的值,像這樣通過值來進行參數傳遞的機制稱為值傳遞

注意

函數間參數的傳遞稱是通過值傳遞進行的。

形參x是實參a的副本,形參n是實參b的副本,所以在調用一方的函數power,即使改變所接受的形參的值,調用的實參也不會受影響。

到此為止,我們已經學習了函數一部分的基礎知識,關于函數部分雖然有些抽象,但不要畏難,多看幾遍書和視頻講解,相信大家都能乘風破浪。

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

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

相關文章

mybatisplus手動獲取數據源執行非主數據庫事務

mybatisplus手動獲取數據源執行非主數據庫事務 class A {// 事務管理器Resourceprivate DataSourceTransactionManager dataSourceTransactionManager;Autowiredprivate DataSource dataSource; // 最終是com.baomidou.dynamic.datasource.DynamicRoutingDataSource類型public…

通過靜態HTTP實現負載均衡

在當今的互聯網環境中&#xff0c;隨著用戶數量的不斷增加和業務需求的不斷擴大&#xff0c;單臺服務器往往無法承受所有的訪問壓力。為了確保網站的可用性和性能&#xff0c;負載均衡成為了一種常見的解決方案。本文將探討如何通過靜態HTTP實現負載均衡&#xff0c;以提升網站…

認識系統服務daemons

什么是daemon與服務&#xff08;service) 常駐內存的是進程&#xff0c;可以提供一些系統或網絡功能&#xff0c;這就是服務。實現service的程序稱為daemon。也就是說要想提供某種服務&#xff0c;daemon實在后臺運行的。 daemon的分類&#xff1a; 1&#xff09;可獨立啟動…

【CSP】202209-1_如此編碼Python實現

文章目錄 [toc]試題編號試題名稱時間限制內存限制題目背景題目描述輸入格式輸出格式樣例1輸入樣例1輸出樣例2輸入樣例2輸出樣例3輸入樣例3輸出樣例3解釋子任務提示Python實現 試題編號 202209-1 試題名稱 如此編碼 時間限制 1.0s 內存限制 512.0MB 題目背景 某次測驗后&#x…

【Angular開發】2023年促進您開發的最佳Angular庫

如果你是一名開發人員&#xff0c;你可以理解平臺的重要性&#xff0c;它可以加快開發過程&#xff0c;顯著減少編碼時間和工作量。 根據StackOverflow開發者2021年的調查&#xff0c;Angular是其中一個令人驚嘆的平臺&#xff0c;它一直贏得人們的喜愛&#xff0c;并獲得了全…

【vtkWidgetRepresentation】第六期 vtkFinitePlaneRepresentation

很高興在雪易的CSDN遇見你 &#xff0c;給你糖糖 歡迎大家加入雪易社區-CSDN社區云 前言 本文分享VTK中的平面Plane表示方法&#xff0c;希望對各位小伙伴有所幫助&#xff01; 感謝各位小伙伴的點贊關注&#xff0c;小易會繼續努力分享&#xff0c;一起進步&#xff01; …

機器人阻抗控制直觀(圖示理解)與控制框架/架構

在剛性碰撞下&#xff0c;機器人的阻抗調節可以使其更好地適應外部環境。具體來說&#xff0c;通過建立力與位移之間的關系&#xff0c;并改變阻抗參數&#xff0c;可以控制機器人對外部力的響應。 在具體實現上&#xff0c;可以采用基于位置的阻抗控制或基于力的阻抗控制。基于…

【Java 基礎】26 枚舉

文章目錄 1. 什么是枚舉2. 定義3. 使用1&#xff09;常量2&#xff09;遍歷3&#xff09;switch 4. 屬性和方法1&#xff09;屬性2&#xff09;方法 5. 實現原理6. 使用場景總結 1. 什么是枚舉 枚舉是列出某些有窮序列集的所有成員的程序&#xff0c;或者是一種特定類型對象的計…

Windows下使用CMD修改本地IP

在網絡適配器界面查看當前網線連接的哪個網口&#xff0c;我當前連的是 以太網 這個名字的&#xff1a; 在windows下使用管理員權限打開CMD命令工具&#xff0c;輸入如下命令(如我想本地ip改成192.168.2.4)&#xff1a; netsh interface ip set address "以太網" st…

LeetCode Hot100 78.子集

題目&#xff1a; 給你一個整數數組 nums &#xff0c;數組中的元素 互不相同 。返回該數組所有可能的子集&#xff08;冪集&#xff09;。 解集 不能 包含重復的子集。你可以按 任意順序 返回解集。 方法&#xff1a;靈神 選 or 不選 class Solution {private final List&…

spring 的概述和入門

? 我是南城余&#xff01;阿里云開發者平臺專家博士證書獲得者&#xff01; 歡迎關注我的博客&#xff01;一同成長&#xff01; 一名從事運維開發的worker&#xff0c;記錄分享學習。 專注于AI&#xff0c;運維開發&#xff0c;windows Linux 系統領域的分享&#xff01; …

信號量的使用和注意事項

大家好&#xff0c;今天給大家介紹信號量的使用和注意事項&#xff0c;文章末尾附有分享大家一個資料包&#xff0c;差不多150多G。里面學習內容、面經、項目都比較新也比較全&#xff01;可進群免費領取。 信號燈(信號量)集 POSIX 線程中的同步用的是無名信號量 進程間的同步使…

喬拓云平臺:微信小程序開發的全新視角與高效路徑

隨著微信小程序的日益普及&#xff0c;越來越多的人開始關注如何開發自己的小程序。對于沒有開發經驗的人來說&#xff0c;借助第三方平臺如喬拓云&#xff0c;可以輕松實現小程序的開發。本文將介紹微信小程序開發需要學習的東西&#xff0c;并探討如何借助喬拓云平臺進行無經…

基于深度學習的鋼鐵缺陷檢測系統(含UI界面,Python代碼,數據集、yolov8)

項目介紹 項目中所用到的算法模型和數據集等信息如下&#xff1a; 算法模型&#xff1a; ? ? yolov8 yolov8主要包含以下幾種創新&#xff1a; ? ? ? ? 1. 添加注意力機制&#xff08;SE、CBAM等&#xff09; ? ? ? ? 2. 修改可變形卷積&#xff08;DySnake-主干c…

【改進YOLOv8】融合可變形大核注意力D-LKA-Attention的油氣管道設備泄露檢測系統

1.研究背景與意義 項目參考AAAI Association for the Advancement of Artificial Intelligence 研究背景與意義 隨著油氣管道設備的廣泛應用&#xff0c;油氣泄露問題已經成為一個嚴重的環境和安全隱患。油氣泄露不僅會造成環境污染&#xff0c;還可能引發火災、爆炸等嚴重事…

掌握vue中國際化使用及配置

文章目錄 &#x1f341;i18n組件安裝&#x1f341;項目中配置 vue-i18n&#x1f341;編寫語言包&#x1f341;國際化的使用 隨著互聯網的普及和全球化的發展&#xff0c;開發國際化的應用程序已經成為一種趨勢。因此&#xff0c;將 VUE 應用程序國際化是非常有必要的。 以下是…

新時代商業旨意:傳統商家如何變革?

隨著新時代的到來&#xff0c;商業環境也在不斷變化。在這個信息爆炸、消費者需求日益復雜化的時代&#xff0c;商業旨意已經不再僅僅是追求利潤&#xff0c;而是轉向了以客戶為中心&#xff0c;追求價值共創、社會責任等多元化的目標。傳統商家面臨著諸多挑戰&#xff0c;如何…

2023四川大學“騰訊杯”新生賽(同步賽)糖果(鴿巢原理)

這個數據范圍, n 是 1 e 6 &#xff0c; a i 也是 1 e 6 n是1e6&#xff0c;a_i也是1e6 n是1e6&#xff0c;ai?也是1e6&#xff0c;任意 a i a j ∈ [ 0 , 2 e 6 ] a_ia_j \in [0, 2e6] ai?aj?∈[0,2e6]&#xff0c;所以如果有答案我們最多枚舉 2 e 6 2e6 2e6個數就可以找到…

視頻剪輯高手揭秘:如何批量減少時長并調整播放速度,提升視頻效果

隨著社交媒體的興起&#xff0c;視頻制作的需求越來越大。然而往往視頻文件存在一些問題&#xff0c;例如時長過長&#xff0c;或者要調整播放速度以更好地傳達信息。這些問題不僅影響了視頻的觀看體驗&#xff0c;也可能導致視頻難以在社交媒體上獲得廣泛的傳播。那么&#xf…

Android Canvas 改變背景顏色

我有一個有兩個 View 的應用 <com.myexample.ui.view.BackgroundView android:id"id/id_draw_canvas_classroom" android:layout_width"fill_parent" android:layout_height"fill_parent" android:layout_marginBottom"3dp" andro…