【Tutorial C】08 函数 Function
函数的定义
C源程序是由函数组成的。
最简单的程序有一个主函数 main(),但实用程序往往由多个函数组成,
由主函数调用其他函数,其他函数也可以互相调用。
函数是C源程序的基本模块,程序的许多功能是通过对函数模块的调用来实现的,
学会编写和调用函数可以提高编程效率。
函数的定义通常包含以下内容:
类型 函数名(形参表说明) /*函数首部*/
{
说明语句 /*函数体*/
执行语句
}
对上面的定义形式进行以下说明:
(1)“类型”是指函数返回值的类型。
函数返回值不能是数组,也不能是函数,除此之外任何合法的数据类型都可以是函数的类型,如:int,long,float,char 等。
函数类型可以省略,当不指明函数类型时,系统默认的是整型。
(2)函数名是用户自定义的标识符,在 C 语言函数定义中不可省略
须符合 C 语言对标识符的规范, 用于标识函数,并用该标识符调用函数。
另外函数名本身也有值,它代表了该函数的入口地址,使用指针 调用函数时,将用到此功能。
(3)形参又称为“形式参数”。
形参表是用逗号分隔的一组变量说明,包括形参的类型和形参的标识 符,
其作用是指出每一个形参的类型和形参的名称,当调用函数时,接收来自主调函数的数据,确定各参 数的值。
(4)用{ }括起来的部分是函数的主体,称为函数体。
函数体是一段程序,确定该函数应完成的规定的 运算,应执行的规定的动作,集中体现了函数的功能。
函数内部应有自己的说明语句和执行语句,但函数 内定义的变量不可以与形参同名。
根据函数定义的一般形式,可以定义一个最简单的函数:
花括号{ }是不可以省略的。
add()
{
;
}
这是 C 语言中一个合法的函数,函数名为 add。
它没有函数类型说明,也没有形参表,同时函数体内 也没有语句。
实际上函数 add 不执行任何操作和运算,
它是一个空函数,在一般情况下是没有用途的,
但 在程序开发的过程中有时是需要的,常用来代替尚未开发完毕的函数。
函数的调用
主调函数使用被调函数的功能,称为函数调用。
在 C 语言中,只有在函数调用时,函数体中定义的功 能才会被执行。
C语言中,函数调用的一般形式为:
函数名(类型 形参,类型 形参...);
对无参函数调用时则无实际参数表。
实际参数表中的参数可以是常数、变量或其他构造类型数据及表 达式,各实参之间用逗号分隔。
在C语言中,可以用以下几种方式调用函数。
(1)函数表达式:
函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。
这种 方式要求函数是有返回值的。
例如:
z=max(x,y);
是一个赋值表达式,把 max 的返回值赋予变量 z。
(2)函数语句:
函数调用的一般形式加上分号即构成函数语句。
例如:
printf ("%d",a);
scanf ("%d",&b);
都是以函数语句的方式调用函数。
(3)函数实参:
函数作为另一个函数调用的实际参数出现。
这种情况是把该函数的返回值作为实参进 行传送,因此要求该函数必须是有返回值的。
例如:
printf("%d",max(x,y)); /*把 max 调用的返回值作为 printf 函数的实参*/
在主调函数中调用某函数之前应对该被调函数进行声明。
在主调函数中对被调函数进行说明的目的是
使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值进行相应的处理。
其一般形式为:
类型说明符 被调函数名(类型 形参,类型 形参...);
需要注意的是,函数的声明和函数的定义有本质上的不同。
主要区别在以下两个方面:
(1)函数的定义是编写一段程序,应有函数的具体功能语句——函数体;而函数的声明仅是向编译系 统的一个说明,不含具体的执行动作。
(2)在程序中,函数的定义只能有一次,而函数的声明可以有多次。
变量的存储类型
在 C 语言中,变量是对程序中数据所占内存空间的一种抽象定义,
定义变量时,用户定义变量的名、 变量的类型,这些都是变量的操作属性。
不仅可以通过变量名访问该变量,系统还通过该标识符确定变量 在内存中的位置。
在计算机中,保存变量当前值的存储单元有两类,一类是内存,另一类是 CPU 的寄存器。
变量的存储类型关系到变量的存储位置,C 语言中定义了 4 种存储属性,
即自动变量、外部变量、静 态变量和寄存器变量,
它关系到变量在内存中的存放位置, 由此决定了变量的保留时间和变量的作用范围。
变量的保留时间又称为生存期,从时间的角度,可将变量分为静态存储和动态存储两种情况。
静态存储是指变量存储在内存的静态存储区,在编译时就分配了存储空间,在整个程序的运行期间,该变量占有 固定的存储单元,程序结束后,这部分空间才释放,变量的值在整个程序中始终存在;
动态存储是指变量 存储在内存的动态存储区,在程序的运行过程中,只有当变量所在的函数被调用时,编译系统才临时为该 变量分配一段内存单元,函数调用结束,该变量空间释放,变量的值只在函数调用期存在。
变量的作用范围又称为作用域,从空间角度,可以将变量分为全局变量和局部变量。
局部变量是在一 个函数或复合语句内定义的变量,它仅在函数或复合语句内有效,编译时,编译系统不为局部变量分配内 存单元,而是在程序运行过程中,当局部变量所在的函数被调用时,编译系统根据需要,临时分配内存, 调用结束,空间释放;
全局变量是在函数之外定义的变量,其作用范围为从定义处开始到本文件结束,编 译时,编译系统为其分配固定的内存单元,在程序运行的自始至终都占用固定单元。
1. 自动变量
函数中的局部变量,如不专门声明为 static 存储类别,都是动态地分配存储空间的,数据存储在动态 存储区中。
函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量)都属此类,
在调用该函 数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。
这类局部变量称为自动变 量。自动变量用关键字 auto 进行存储类别的声明,
例如声明一个自动变量:
int fun(int a)
{
auto int b,c=3; /*定义 b,c 为自动变量*/
}
a 是函数 fun()的形参,b、c 是自动变量,并对 c 赋初值 3。执行完 fun()函数后,自动释放 a、b、c 所占的存储单元。
2. 外部变量
外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。
如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件末尾。
如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字 extern 对该变量进行“外部变量声明”。
表示该 变量是一个已经定义的外部变量。
有了此声明,就可以从“声明”处起,合法地使用该外部变量.
用 extern 声明外部变量,扩展程序文件中的作用域
3. 静态变量
有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,
这时就应该指定局部变量为静 态局部变量,用关键字 static 进行声明。
4. 寄存器变量
为提高效率,C 语言允许将局部变量的值存放在 CPU 的寄存器中,这种变量叫做寄存器变量,用关键字 register 声明。
使用寄存器变量需要注意以下几点:
(1)只有局部自动变量和形式参数可以作为寄存器变量。
(2)一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量。
(3)不能使用取地址运算符“&”求寄存器变量的地址。
原文&习题:
https://www.dotcpp.com/course/28
【Tutorial C】08 函数 Function的更多相关文章
- JavaScript入门-函数function(二)
JavaScript入门-函数function(二) 递归函数 什么是递归函数? 递归简单理解就是,在函数体里,调用自己. //我们在求一个10的阶乘的时候,可能会这么做 //写一个循环 var to ...
- Javascript自执行匿名函数(function() { })()的原理分析
匿名函数指没有指定函数名或指针的函数,自执行匿名函数只是其中一种,下文中称这种函数为:自执行函数 下面是一个最常见的自执行函数: // 传统匿名函数 (function() { alert('hell ...
- JavaScript自运行函数(function(){})()的理解
今天打开JQuery源文件(jquery-1.8.3), 看到JQuery的初始化过程是这样的 (function( window, undefined ) { // .... })( window ...
- 深入理解javascript中的立即执行函数(function(){…})()
投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-06-12 我要评论 这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是 ...
- javaScript的函数(Function)对象的声明(@包括函数声明和函数表达式)
写作缘由: 平时再用js写函数的时候,一般都是以惯例 function fn () {} 的方式来声明一个函数,在阅读一些优秀插件的时候又不免见到 var fn = function () {} 这种 ...
- 函数(Function)作用域 / 远程函数执行
函数跟变量一样也是有作用域的:Global.Script.Local.Private Global:作用于整个PowerShell会话,只要PowerShell会话不结束,被Global修饰的变量和函 ...
- Javascript自执行匿名函数(function() { })()的原理浅析
匿名函数就是没有函数名的函数.这篇文章主要介绍了Javascript自执行匿名函数(function() { })()的原理浅析的相关资料,需要的朋友可以参考下 函数是JavaScript中最灵活的一 ...
- Javascript学习之函数(function)
在JS中,Function(函数)类型实际上是对象;每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针. 一 函 ...
- js立即执行函数: (function ( ){...})( ) 与 (function ( ){...}( ))
( function(){…} )() ( function (){…} () ) 是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达 ...
- 深入理解立即执行函数(function(){})();
( function(){-} )()和( function (){-} () )是两种javascript立即执行函数的常见写法,要理解立即执行函数,需要先理解一些函数的基本概念. 1,函数声明,函 ...
随机推荐
- MySQL 导出一条数据的插入语句
1.MySQL 导出一条数据的插入语句的方法 在MySQL中,如果我们想要导出一条数据的插入语句,我们可以使用SELECT ... INTO OUTFILE语句(但这通常用于将整个表或查询结果导出到一 ...
- 使用Python实现深度学习模型:序列到序列模型(Seq2Seq)
本文分享自华为云社区<使用Python实现深度学习模型:序列到序列模型(Seq2Seq)>,作者: Echo_Wish. 序列到序列(Seq2Seq)模型是一种深度学习模型,广泛应用于机器 ...
- 国产大模型参加高考,同写2024年高考作文,及格分(通义千问、Kimi、智谱清言、Gemini Advanced、Claude-3-Sonnet、GPT-4o)
大家好,我是章北海 今天高考,上午的语文结束,市面上又要来一场大模型参考的文章了. 我也凑凑热闹,让通义千问.Kimi.智谱清言一起来写一下高考作文. 公平起见,不加任何其他prompt,直接把题目甩 ...
- LeetCode 208. Implement Trie (Prefix Tree) 实现 Trie (前缀树)(C++/Java)
题目: Implement a trie with insert, search, and startsWith methods. Example: Trie trie = new Trie(); t ...
- 深入剖析C++多态的实现与原理-详解
目录 多态基础 虚函数 虚函数的继承 虚类/虚基类 重写/覆盖 条件: 概念: 多态的条件 其他的多态行为 多态中子类可以不写virtual 协变 代码举例 继承遗留问题解决 析构函数 具体解决方式: ...
- ABC339
题解不应该流露出太多感情,对吧. E 建议评黄. 首先我们可以想到暴力 dp. 定义 \(dp_i\) 为以 \(a_i\) 为结尾满足题目意思的最长序列的长度. 很明显,时间复杂度为 \(O(n^2 ...
- 修改带有强签名的DLL并重新生成
一.如果含有强签名,需要先使用去除强签名工具,这里使用的是"StrongNameRemove",点击修正就可以了,如果没有强签名可直接下一步: 二.将没有强签名的DLL进行反编译, ...
- AIGC底层技术介绍
1.AIGC概述 AIGC,全称Artificial Intelligence Generated Content,即人工智能生成内容.这是一种新兴的人工智能技术,其核心思想是利用人工智能模型,根据给 ...
- 如果redis没有设置expire,他是否默认永不过期
如果redis没有设置expire,他是否默认永不过期?默认是的 通过EXPIRE key seconds 命令来设置数据的过期时间.返回1表明设置成功,返回0表明key不存在或者不能成功设置过期时间 ...
- Python 导入包失败,提示“most likely due to a circular import”
详细报错信息如下: ImportError: cannot import name 'DoReplace' from partially initialized module 'common.do_r ...