C语言函数章--第二弹(让冤种室友用你的函数,但不给他看函数源码)

news2025/2/23 13:17:58

前言
💖作者龟龟不断向前
简介宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。
👻专栏:C++初阶知识点

👻工具分享

  1. 刷题: 牛客网 leetcode
  2. 笔记软件:有道云笔记
  3. 画图软件:Xmind(思维导图) diagrams(流程图)

在这里插入图片描述

如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持博主🙊,如有不足还请指点,博主及时改正

函数–第二弹

文章目录

    • 函数--第二弹
      • 🚀1.函数的返回值
        • 🍉如何设计返回值
        • 🍉那些模棱两可的函数写法
      • 🚀2.嵌套调用 and 链式访问
        • 🍉嵌套调用
        • 🍉链式访问
          • 🍇求三个数的最大值
          • 🍇经典例题:来自`printf`的链式访问
      • 🚀3.函数的声明和定义
        • 🍉工程化写法(分模块)
      • 🚀4.浅浅地使用一下静态库(lib文件)
        • 🍉不显示源码给公司使用项目

🚀1.函数的返回值

 

🍉如何设计返回值

  既然有些函数不需要返回值,有些函数需要返回值,那我们该如何确定呢?答案很简单:根据需求来

  • 如果一个函数的需求是:只需要打印某些图案,那么他是不需要返回值(void)的。

    例如我们上篇文章猜数字小游戏里面的菜单函数menu

  • 如何一个函数的需求是:只需要改变外部变量的值,那么它也可以设计成void通过传址调用即可

    例如我们上篇文章所说的交换函数Swap

    void Swap(int* x, int* y)
    {
    	int tmp = *x;
    	*x = *y;
    	*y = tmp;
    }
    
  • 如果一个函数的需求是:求出某个值,那么它可以设计成需要返回值的,将求出的那个值通过return来返回给调用它的程序。

    例如我们熟悉的 最大值函数Max 加法函数Add

 

🍉那些模棱两可的函数写法

  1. 返回类型不写

      当函数的返回类型未指明时,编译器默认返回类型为int类型,并且会根据编译器自己的方式来确定返回值

    #include<stdio.h>
    
    test()
    {
    	printf("hello world\n");
    }
    
    int main()
    {
    	int ret = test();
    	printf("%d\n", ret);//这次的返回值是test打印在屏幕中的字符个数,算\n
    	return 0;
    }
    

    在这里插入图片描述

     

  2. 无函数参数时,不写void

      当函数参数时,不写void时,我在在调用该函数时是可以传参的(C语言设计不严谨的地方),只是函数不接受而已

    #include<stdio.h>
    
    void test()
    {
    	printf("hello world\n");
    }
    
    int main()
    {
    	int ret = test(100);//编译通过
    	printf("%d\n", ret);//这次的返回值是test打印在屏幕中的字符个数,算\n
    	return 0;
    }
    

     

      不过这种写法影响不大,大部分同学还是会采用这种写法

     

     

🚀2.嵌套调用 and 链式访问

 

🍉嵌套调用

  函数和函数之间可以根据实际的需求进行组合的,也就是可以互相调用的。

#include<stdio.h>

void Star()
{
	printf("*");
}

void three_stars()
{
	for (int i = 0; i < 3; ++i)
	{
		Star();
	}
	printf("\n");
}

int main()
{
	three_stars();
	return 0;
}

 

图解

在这里插入图片描述

  虽然这个代码没有展现出嵌套调用的价值,但是在一些大型工程中,嵌套调用是必要的,实现高内聚,低耦合的要求

也使得程序更容易被维护。

 

🍉链式访问

概念:

把一个函数的返回值作为另外一个函数的参数

在这里插入图片描述

 

🍇求三个数的最大值

 

求两个数的最大值

相信大家现在可以10秒之内就能将这个函数实现了

int Max(int x, int y)
{
	return x > y ? x : y;
}

 

求三个数的最大值

这里大家可能会想到if条件判断来实现一个求三个数最大值的函数,但如果再限制一下,只让你使用Max(两个数的最大值),你能否求出三个数的最大值呢?

没错,我们只需要先求出前两个数的最大值,再将这个最大值跟第三个数比较即可,如下:

#include<stdio.h>

int Max(int x, int y)
{
	return x > y ? x : y;
}

int main()
{
	int a = 12;
	int b = 20;
	int c = 30;
	int max = Max(Max(a, b),c);
	printf("%d\n", max);
	return 0;
}

 

🍇经典例题:来自printf的链式访问

那么我们首先要弄清楚printf的返回值是什么,上篇文章我们已经介绍了如何学习库函数–查文档

找到函数的返回值的介绍部分

在这里插入图片描述

 

现学现用:大家可以思考一下,下面的程序ret的值是多少

#include<stdio.h>

int main()
{
    int ret = printf("hello world\n");
    printf("ret = %d\n",ret);
    return 0;
}

答案是:12,因为这个printf输出了hello world\n这些字符,\n转义字符,算一个字符,一共有12个

 

 

经典例题

#include<stdio.h>

int main()
{
	printf("%d", printf("%d", printf("%d", 43)));
	return 0;
}

答案:4321

解释

在这里插入图片描述

首先执行1号printf,输出43,43为两个字符,所以1号printf返回值为2

接着执行2号printf,接收了1号printf的返回值2,输出2,2为1个字符,所以2号printf的返回值为1

最后执行3号printf,接收了2号printf的返回值1,输出1

 

 

🚀3.函数的声明和定义

这个知识点也是小伙伴们在学习函数之初,最容易产生疑惑的地方:

为什么定义的函数老放在调用其的函数的上部,放在下面不行吗?

这里咱们要介绍下:编译器扫描代码是自上向下扫描的,如果遇到一下代码编译器会干什么

 

#include<stdio.h>

int main()
{
	printf("%d\n", Max(100, 200));
	return 0;
}

int Max(int x, int y)
{
	return x > y ? x : y;
}

 

在这里插入图片描述

 


在这里插入图片描述

 

 

  所以有些课本经常是这样写的

#include<stdio.h>

//声明部分
int Max(int x, int y);//提前跟编译器说,后面有个Max函数,你到时候遇到了就别大惊小怪了
    
int main()
{
	printf("%d\n", Max(100, 200));
	return 0;
}

//定义部分
int Max(int x, int y)
{
	return x > y ? x : y;
}

即上述的int Max(int x, int y);–会告诉编译器后面有Max函数

具体有没有就要看你是否真的定义了

 


 

🍉工程化写法(分模块)

通常我们将函数的声明放在.h即头文件当中

将函数的定义放在.c文件当中

当test.c里面要使用该函数时,只需要包含对应的头文件即可

这样就很好地达到了分工明确,模块编程,也便于代码维护和查找错误

库函数的头文件的包含方式为#include<头文件>

库函数的头文件的包含方式为#include“头文件”

 

 

🚀4.浅浅地使用一下静态库(lib文件)

🍉不显示源码给公司使用项目

 

场景:你是一个CSDN的大牛博主,每天写着优良的代码,并且在CSDN平台分享,而且在gitee上面有着自己的仓库

仓库里面有着开源项目,私有项目。突然有一天有个公司找上了优秀的你,想让你实现某个项目租给公司使用。

那么当你实现完了这个项目,想要给公司使用,但是又不想让公司看到你的源码,该怎么办呢?

 

  1. 实现自己的项目(项目名Add)–已经测试功能完整

    里面有头文件Add.h(放着Add的头文件包含)

    里面有源文件Add.c(放着Add功能实现的源码)

  2. 修改项目属性,生成lib文件

    在这里插入图片描述

     

    在这里插入图片描述

     

      F7编译,生成.lib文件

    在这里插入图片描述

     

      我们按照上述的路径,找到.lib即可

    在这里插入图片描述

      大家可以使用记事本打开Add.lib是乱码,看不懂的

     

  3. 将Add项目的头文件Add.lib文件放到公司项目当前目录下

我们将头文件和Add.lib租给公司,然后它只需要将这两个文件放到当前目录下即可

在这里插入图片描述

在这里插入图片描述

 

  1. 包含头文件,导入静态库

在这里插入图片描述

 

在这里插入图片描述

 

总结

  1. 将自己的项目生成lib文件
  2. 然后将该自己项目的头文件和lib文件,放到另一个项目的工作目录中
  3. 在另一个项目中包含头文件,导入静态库

 

大家可以试一试,不需要仔细地了解静态库和动态库的知识,也是可以玩一下的。很有意思!

 

本篇文章就讲到这里,下期讲解函数的强化训练–函数递归,咱们下期见

 

点赞

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

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

相关文章

Error注入攻击

&#x1f4aa;&#x1f4aa;Error注入攻击1.创建漏洞环境2.漏洞攻击2.1判断是否有注入2.2信息收集2.3注入获取数据库名2.4注入获取表名2.5注入获取列名2.6注入获取信息3.sql靶场实战1.创建漏洞环境 &#x1f4aa;&#x1f4aa;第一步创建sql环境&#xff0c;直接再mysql下运行 …

Flutter——软件安装与环境配置

Flutter入门官网Flutter SDK下载创建Flutter项目在ios上运行第一个Flutter项目效果图代码总结官网 Flutter开发手册网址如下 Flutter SDK下载 下载地址 第一步&#xff1a;进入官网&#xff0c;选择自己相对应的系统 第二步&#xff1a;选择对应版本SDK并下载到本地 创建Flu…

electron调用dll文件

Electron 对系统层能力的使用可能比较弱&#xff0c;此时需要求助 Python、C、C# 等语言&#xff0c;通过 ffi-napi 库可以让 Node.js 使用 C dll&#xff0c;通过 electron-edge-js 库可以让 Node.js 使用 C# dll 1. 先确定dll文件是用什么语言写的. 使用peid 应用查看- 这个…

【Transformers】第 2 章:主题的实践介绍

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Node.js | 基于 MongoDB 的简易用户管理系统

&#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff08;源创征文一等奖作品&#xff09;&#xff1a;前端之行&#xff0c;任重道远&#xff08;来自大三学长的万字自述&#xff09; &#x1f5a5;️ TypeScript知识总结&…

C++秋招经验贴

文章目录一、个人背景及秋招情况1.个人背景2.秋招情况二、求职C强相关开发岗位的准备过程以及一些建议1. 八股2. 力扣刷题3. 实习4. 项目三、总结一、个人背景及秋招情况 1.个人背景 本科&#xff1a;二本&#xff0c;材料专业   硕士&#xff1a;211硕&#xff0c;光学工程…

TI IWR1642毫米波雷达使用串口原始数据采集与分析

本文编辑&#xff1a;调皮哥的小助理 1.引言 如果文章能够给你带来价值&#xff0c;希望能够关注我。 如果文章能够让你学习到知识&#xff0c;希望你能够点个赞&#xff01; 好了下面开始今天的学习内容吧。 今天给大家分享的是 《TI 的IWR1642毫米波雷达使用串口原始数据…

深度学习入门(十五)环境和分布偏移(了解)

深度学习入门&#xff08;十五&#xff09;环境和分布偏移前言环境和分布偏移教材1 分布偏移的类型1.1 协变量偏移1.2 标签偏移1.3 概念偏移2 分布偏移示例2.1医学诊断2.2 自动驾驶汽车2.3 非平稳分布2.4 更多轶事3 分布偏移纠正3.1 经验风险与实际风险3.2 协变量偏移纠正3.3 标…

MATLAB | 一起来感受数学之美叭

前两天去观摩了MATHWORKS官方举办的Mathematics is beautiful数学之美投票比赛&#xff0c;见到了很多非常惊艳的作品&#xff0c;在这里分享给大家让大家一同感受大神们的创造力&#xff0c;接下来由我来做全程解说。 虽然看起来代码都写好了&#xff0c;&#xff0c;&#x…

程序员眼中看到的网页是如何制作出来的?

一、认识网页 在学习之初&#xff0c;我们需要认识一下网页的概念&#xff0c;因为网页与我们的 html是息息相关的。 那么接下来我们来看一下&#xff0c;我们经常去通过浏览器查看的网页&#xff0c;它的本质是什么&#xff1f;在此我们需要去做一个对比。我们眼中看到的网页…

聚类算法概要及相关知识准备

聚类的概念 聚类分析是在数据中发现数据对象之间的关系&#xff0c;将数据进行分组&#xff0c;组内的相似性越大&#xff0c;组间的差别越大&#xff0c;则聚类效果越好。 将物理或抽象对象的集合分成由类似对象组成的多个类或簇&#xff08;cluster&#xff09;的过程被称为…

SpringBoot+Vue的社区疫情防控管理系统|基于Python+Django的社区物资采购系统

&#x1f496;&#x1f496;作者&#xff1a;IT跃迁谷毕设展 &#x1f499;&#x1f499;个人简介&#xff1a;曾长期从事计算机专业培训教学&#xff0c;本人也热爱上课教学&#xff0c;语言擅长Java、微信小程序、Python、Golang、安卓Android等。平常会做一些项目定制化开发…

Cookie使用详解

Cookie使用详解 目录Cookie使用详解理论知识前言创建Cookiecookie 的属性介绍name 、valuedomainpathExpires 、Max-AgeSameSiteSecure&#xff0c;HttpOnlyCookie与跨域、安全知识点小结实践相关配置修改代码实践实验过程记录其它小结理论知识 前言 HTTP Cookie&#xff08;…

使用Charles和iPhone进行微信小程序抓包详解

基于工作原因&#xff0c;需要对一款微信小程序进行测试。本次任务是纯黑盒方式&#xff0c;所以只有通过抓包的方式找到接口及参数列表&#xff0c;再逐一进行功能和性能测试。 一、使用工具 网络抓包工具&#xff1a;Charles 设备&#xff1a;iPhone6s&#xff0c;iPhone1…

数据分析 | Pandas 200道练习题,每日10道题,学完必成大神(8)

文章目录前期准备1. 将收盘价5日均线&#xff0c;20日均线与原始数据绘制在同一个图上2. 按周为采样规则&#xff0c;取一周收盘价的最大值3. 绘重制采样数据与原始数据4. 将数据往后移动5天、5. 将数据向前移动5天6. 使用expending函数计算开盘价的移动窗口的均值7. 绘制上一题…

牛客刷题系列(汽水瓶,跳台阶扩展问题,斐波那契凤尾)

牛客刷题系列一&#xff1a;汽水瓶题目链接常规写法简便写法二.跳台阶扩展问题三&#xff1a;斐波那契凤尾很多小伙伴为了刷题发愁 今天为大家推荐一款刷题神奇哦&#xff1a;刷题面试神器牛客 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有&#xff0c;…

云IDE介绍——CSDN开发云

云IDE产品介绍云IDE使用教程 免费使用地址&#xff1a;点击【云IDE】&#xff0c;即可开始创建工作空间啦~ 作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xf…

【学习笔记之数据结构】时间复杂度与空间复杂度

一、算法效率 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空间&#xff08;内存&#xff09;资源。因此衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的&#xff0c;即时间复杂度和空间复杂度。   时间复杂度主要衡量一个算法的运行快…

2022年音视频面试题 C/C++/Linux/FFmpeg/webRTC/rtmp/hls/rtsp/ffplay/srs

1&#xff09;OpenGL 是按照什么架构设计的&#xff1f; OpenGL 的渲染架构是 Client/Server 模式&#xff1a;Client&#xff08;客户端&#xff09;指的是我们在 CPU 上运行的一些代码&#xff0c;比如我们会编写 OC/C/Java 代码调用 OpenGL 的一些 API&#xff1b;而 Server…

mybatis学习(1)

使用mybatis也是有一段时间了&#xff0c;但是一直没有系统了解和学习&#xff0c;最近正好有空&#xff0c;索性花点时间熟悉下。 为什么是mybatis&#xff1f; 了解mybatis之前&#xff0c;需要知道什么是"数据库持久层"&#xff0c;我的理解&#xff0c;就是将数…