7.2 怎样定义函数

news2024/12/23 14:17:49

 7.2.1 为什么要定义函数

 主要内容:

为什么要定义函数

C语言要求所有在程序中用到的函数必须“先定义,后使用”。这是因为在调用一个函数之前,编译系统需要知道这个函数的名字、返回值类型、功能以及参数的个数与类型。如果没有事先定义,编译系统将无法知道这个函数是什么,要实现什么功能,从而无法执行这个函数。

例如,如果想用max函数来求两个数中的较大者,必须事先按规范对它进行定义。这样,当程序执行max时,编译系统就会按照定义时所指定的功能执行。

定义函数应包括的内容

定义函数时,应该包括以下几个内容:

  1. 函数名字:以便以后按名调用。
  2. 函数类型:即函数返回值的类型。
  3. 参数的名字和类型:以便在调用函数时向它们传递数据。对无参函数不需要这项。
  4. 函数功能:即函数应当完成什么操作,这是最重要的,是在函数体中解决的。

库函数

C编译系统提供了一些库函数,这些库函数是由编译系统事先定义好的,包含在库文件中。程序设计者不必自己定义这些库函数,只需要通过#include指令把有关的头文件包含到本文件模块中即可。例如,如果在程序中用到数学函数(如sqrtfabssincos等),就必须在本文件模块的开头写上:

#include<math.h>

这些库函数只提供了最基本、最通用的一些函数。对于库函数中没有提供的函数,程序设计者需要在程序中自己定义。

 7.2.2 定义函数的方法

主要内容:

这段文字描述了在C语言(或类似的编程语言)中定义函数的不同方法。以下是各部分的概述:

### 1. 定义无参函数
无参函数是没有输入参数的函数。它们由`void`关键字声明,表明这个函数不返回值。例子包括`print_star`和`print_message`函数。以下是定义无参函数的一般形式:

类型名 函数名()
函数体
或


类型名 函数名(void)

函数体

### 2. 定义有参函数
有参函数接受一个或多个参数。以下是有参函数的例子,该函数返回两个整数中的最大值:

int max(int x, int y)
{
    int z;
    z = x > y ? x : y;
    return(z);
}


定义有参函数的一般形式为:

类型名 函数名(形式参数列表)
函数体

### 3. 定义空函数
空函数不执行任何操作。它们通常用于占位,预留空间以便未来实现某些功能。以下是定义空函数的形式:

void dummy()
{}


调用空函数不会执行任何操作。例如,在程序设计中,可以使用空函数来占用一个位置,预留未来扩充的功能,当功能实现时,再替换为空函数。

### 总结
这三种定义函数的方法分别应用于不同的场景。无参函数通常用于不需要输入并且不返回值的情况。有参函数可以处理输入参数并返回值。空函数主要用作占位符,为未来的功能扩展提供便利。这些方法结合使用,可以创建出结构清晰、可读性好且方便扩展的程序。

 

总结:

在C语言中,定义函数是一个核心概念,它涉及到以下几个重点、难点和易错点:

### 重点
1. **函数声明和定义**:
   - 函数声明:声明函数的返回类型、函数名和参数类型。
   - 函数定义:包含函数的实际代码和逻辑。
   - 函数原型:是函数声明的一部分,用于告知编译器函数的签名。

2. **返回类型**:
   - 每个函数都有一个返回类型,指定了函数返回值的数据类型。
   - 若函数不返回值,使用`void`作为返回类型。

3. **参数列表**:
   - 函数可以有参数,通过参数列表定义。
   - 参数可以是任何数据类型,并且可以有任意数量的参数。

### 难点
1. **作用域**:
   - 理解局部变量与全局变量的作用域及其可见性。
   - 全局变量对所有函数可见,而局部变量仅在定义它的函数内可见。

2. **参数传递**:
   - 理解值传递与引用传递的区别。
   - 在C语言中,函数参数默认是通过值传递,即传递变量的拷贝,函数内的操作不会影响原变量。

3. **递归**:
   - 递归是一种函数调用自身的技术。
   - 正确使用递归需要正确的基本情况和递归情况,以避免无限递归。

### 易错点
1. **函数声明和定义的混淆**:
   - 函数声明没有函数体,而函数定义有。
   - 函数应该在被调用之前被声明或定义,以免出现“implicit declaration”警告。

2. **参数类型和数量的不匹配**:
   - 调用函数时,实参的类型和数量必须与形参匹配。
   - 不匹配可能导致编译错误或未定义的行为。

3. **返回类型不匹配**:
   - 函数的实际返回值必须匹配其声明的返回类型。
   - 若函数声明为`void`,则不能返回值;若声明为其他类型,必须返回该类型的值。

4. **忘记返回值**:
   - 若函数有非`void`的返回类型,忘记返回值会导致编译器警告,并可能返回未定义的值。

5. **递归深度**:
   - 如果递归函数没有正确的终止条件,或者递归深度太大,将导致堆栈溢出。### 示例

 


// 函数声明
int max(int a, int b);

// 函数定义

int max(int a, int b) {
    return a > b ? a : b;
}

在编写C语言函数时,务必注意以上的重点、难点和易错点,以避免常见的错误和问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1051357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

400G DR4 QSFP-DD光模块:数据中心应用全攻略

在当今数字化时代&#xff0c;对于企业和供应商来说&#xff0c;高速数据传输至关重要。随着对更快数据传输的需求不断攀升&#xff0c;400G DR4 QSFP-DD光模块已经成为高速网络的最新解决方案。本文将全面介绍400G DR4 QSFP-DD光模块在数据中心应用中的优势和技术规范。 什么…

基于Java的校园体育赛事竞赛管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

性能分析-java虚拟机性能监控

虚拟机性能监控 给一个系统定位问题的时候&#xff0c;知识、经验是关键基础&#xff0c;数据是依据&#xff0c;工具是运用知识处理数据的手段。这里说的数据包括&#xff1a;运行日志、异常堆栈、GC日志、线程快照&#xff08;threaddump/javacore文件&#xff09;、堆转储快…

2023-9-29 JZ32 从上往下打印二叉树

题目链接&#xff1a;从上往下打印二叉树 import java.util.*; import java.util.ArrayList; /** public class TreeNode {int val 0;TreeNode left null;TreeNode right null;public TreeNode(int val) {this.val val;}} */ public class Solution {public ArrayList<I…

redis-设置从节点

节点结构 节点配置文件 主节点 不变 6380节点 port 6380 slaveof 127.0.0.1 63796381节点 port 6381 slaveof 127.0.0.1 6380启动 指定配置文件的方式启动 D:\jiqun\redis\Redis-6380>redis-server.exe redis.windows.conf启动时&#xff0c;会触发同步数据命令 主节点…

Android Studio打包记录

我感觉对于android程序来说&#xff0c;打包还是比较重要的。 打包记录&#xff1a; 第一步&#xff1a; 第二步&#xff1a; 选第二个&#xff0c;再点next 第三步&#xff1a; 然后成这个样子了 第四步&#xff1a; 随便选个吧 点击create 结果&#xff1a; 放在手…

MongoDB之用户与权限管理、备份与恢复管理以及客户端工具的使用

用户与权限管理、备份与恢复管理以及客户端工具的使用 用户、权限管理内置角色创建超级管理员创建普通用户认证登录查询用户修改用户修改密码删除用户 备份与恢复备份恢复定时备份 MongoDB操作工具mongo shellMongoDB CompassStudio 3T 用户、权限管理 MongoDB默认不使用权限认…

〔025〕Stable Diffusion 之 接口开发 篇

✨ 目录 🎈 启动接口🎈 接口文档🎈 接口开发🎈 代码解释🎈 启动接口 想要在各种其他服务中对接 Stable Diffusion 的绘画功能,需要开启 Stable Diffusion 的 api 功能开发接口需要有一定的技术功底才可以,非技术人员其实不用学习直接在 webui-user.bat 文件中的 se…

乒乓球游戏控制器verilog带报告

名称&#xff1a;乒乓球游戏控制器verilog&#xff08;代码在文末付费下载&#xff09; 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a; 乒乓球控制器&#xff08;数码管显示各3位&#xff1a;2位显示当前局分数&#xff0c;1位赢得局数&#xff0c;再…

Linux 端口

查看端口占用 1、使用nmap命令查看端口的占用情况 安装nmap&#xff1a;yum -y install nmap 语法&#xff1a;nmap 被查看的IP地址 可以看到&#xff0c;本机&#xff08;127.0.0.1&#xff09;上有7个端口现在被程序占用了。 2、使用netstat命令查看指定端口的占用情况 语…

SAAJ:SOAP with Attachments API for Java interface

介绍 支持带附件的SOAP消息Java接口&#xff08;SAAJ&#xff1a;SOAP with Attachments API for Java interface&#xff09;&#xff0c;定义了一套API&#xff0c;使开发者可以产生、消费遵从SOAP 1.1, SOAP 1.2, 和SOAP Attachments Feature的消息。 参考资源 1.4版本参…

Linux常见指令2

Linux常见指令[2] 一.Linux常见指令1.man补充知识:nano 2.cp3.mv4.cat补充知识:echo输出重定向追加重定向回到catcat其他用法 5.less和more补充内容回到less 6.head和tail补充知识:命令行管道 一.Linux常见指令 前言:为了方便我们在Linux中写指令 介绍一下: 1.clear指令: 清屏…

Springboot中slf4j日志的简单应用

1、注入依赖&#xff08;pom.xml&#xff09; <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.9</version> &…

C语言进程的相关操作

C语言进程的相关操作 进程简介 每个进程都有一个非负整数形式到的唯一编号&#xff0c;即PID&#xff08;Process Identification&#xff0c;进程标识&#xff09;PID在任何时刻都是唯一的&#xff0c;但是可以重用&#xff0c;当进程终止并被回收以后&#xff0c;其PID就可…

分析一段js加密代码

源代码 (function(){var KBP,EbW482-471;function wHY(r){var y2043987;var lr.length;var a[];for(var g0;g<l;g){a[g]r.charAt(g)};for(var g0;g<l;g){var vy*(g289)(y%39401);var ty*(g287)(y%31258);var xv%l;var pt%l;var ma[x];a[x]a[p];a[p]m;y(vt)%2251814;};re…

华为云云耀云服务器L实例评测|云耀云服务器L实例部署推箱子经典小游戏

[TOC](华为云云耀云服务器L实例评测&#xff5c;云耀云服务器L实例部署推箱子经典小游戏 一、前言二、Sokoban小游戏介绍2.1 Sokoban小游戏简介2.2 Sokoban小游戏玩法 三、本次实践介绍3.1 本次实践简介3.2 本次环境规划 四、购买云耀云服务器L实例4.1 购买云耀云服务器L实例4.…

跟着Nature Plant学图形颜色搭配 | caecopal包

写在前面 今天在Nature Plant(IF:16.0)期刊中看到文中的图形&#xff0c;进一步的查看后发现作者使用一个R包来进行图形颜色的搭配。就此机会也分享给大家&#xff0c;若你需要可以进一步查看及使用此包。 对于图形颜色的搭配&#xff0c;对于文章整体美观是非常重要。但是&a…

坐标系上的交互+分治与交互:CF788D

https://codeforces.com/contest/788/problem/D 坐标系上的交互有一种常见套路&#xff0c;就是抓住一些关键的线 x轴y轴yx&#xff08;就是此题&#xff09; 然后考虑接下来怎么做。 交互题常见有二分的套路&#xff0c;此题我们可以考虑推广到分治。 不断判断mid&#xf…

修改sqlmap-Tamper脚本

修改sqlmap-Tamper脚本 文章目录 修改sqlmap-Tamper脚本1 sqlmap官网2 sql注入漏洞注入尝试3 环境&#xff1a;sqli-labs/Less-26a/3.1 尝试宽字节注入: 3.2 sqlmap使用3.3准备修改sqlmap使用 4 sqlmap中-tamper工厂&#xff08;输入输出&#xff09;4.1 [参考文章&#xff1a;…

用MFC写的OCX,在HTML调用事件有响应,多线程中调用时网页上事件无响应 :用消息通知来更新可以

问题:连接成功后&#xff0c;点交易无事件。但每次点连接都有事件。直接点交易也有事件。好像跟延时有关系。 Sleep(10000)可以&#xff0c;跟延时没关系。 固定参数也无响应&#xff0c;跟参数没关系。 可能是多线程有关系。用消息通知来更新可以。 void Callback(int code…