什么是函数?从定义来看,函数就是一段可以重复使用的代码块,比如下面这样
void hanshu()
{
int a = 0;
int b = 3;
}
这时候就应该有人要跳出来了,这是什么**!确实,作为一个强烈反对屎山代码存在的编程者来说,一个好的函数应该是一个有着合理命名,并且功能紧凑的功能块,而不仅只是一份可以重复调用执行的代码。像下面这个一眼能看出其功能和实现逻辑才算是一个好函数。
int add(int num0, int num1)
{
return (num0 + num1);
}
有了以上的认识还不够,我们应该更加剖根究底的看一下。总的来说,计算机是一个可以输入输出的系统,每个具体的项目产品也是,函数作为这座大山的基本组成单位,自然也是个系统。函数既然是一个系统,则就应该有一个系统视角的认识和理解。
 
传统意义来讲,一个函数的输入,就是它的形参,一个函数的输出就是它的返回值,对上面Add()函数来说,num0和num1就是输入,return (num0 + num1)则是输出。
 
因为语言功能的限制,使得用以上规则写出的函数有些死板,不能灵活应对多变的编程需求,比如返回值无法直接返回一个数组,想要通过返回值返回一个数组往往需要有堆区空间的配合。

换个视角看函数输入输出


虽然用传统的方法来使用函数更符合每个人的编程习惯,不过有时候我们需要打破这种规范。函数作为一个有输入输出的系统,我们也可以用形参或者全局变量当作为函数的输出。
// 用形参作为函数输出
void add(int num0, int num1, int &ret)
{
*ret = num0 + num1;
} // 用全局变量作为函数输出
int ret;
void add(int num0, int num1)
{
ret =  (num0 + num1);
}
同理,对于函数的输入,也不必拘泥于形参的输入,全局变量也应该算入。
 
虽然以上的方式写出的函数看起来有些别扭,但是在一些情景中却是很管用的,尤其是将形参作为函数输出的方式在 Linux 的系统调用中常常能看见其影子。对于函数的灵活使用能让我们应对各种灵活的场景,也能进一步提高对于语言的理解。

这样看C函数才对的更多相关文章

  1. 从setTimeout看js函数执行

    老实说,写这篇文章的时候心里是有点压抑的,因为受到打击了,为什么?就 因为喜欢折腾不小心看到了这个"简单"的函数:        for (var i = 0; i < 5; ...

  2. [转]看了这个才发现jQuery源代码不是那么晦涩

    很多人觉得jquery.ext等一些开源js源代码 十分的晦涩,读不懂,遇到问题需要调试也很费劲.其实我个人感觉主要是有几个方面的原因: 对一些js不常用的语法.操作符不熟悉 某个function中又 ...

  3. 从一段代码看fork()函数及其引发的竞争

    首先来看一段从<UNIX环境高级编程>中摘录的一段很有意思的代码.借此我们再来谈谈fork()函数的一些问题. #include "apue.h" static voi ...

  4. JavaScript初学者必看“箭头函数”

    译者按: 箭头函数看上去只是语法的变动,其实也影响了this的作用域. 原文: JavaScript: Arrow Functions for Beginners 译者: Fundebug 为了保证可 ...

  5. 看了这个才发现jQuery源代码不是那么晦涩

    很多人觉得jquery.ext等一些开源js源代码 十分的晦涩,读不懂,遇到问题需要调试也很费劲.其实我个人感觉主要是有几个方面的原因: 1.对一些js不常用的语法.操作符不熟悉 2.某个functi ...

  6. 以面试官的角度看strcpy函数

    一:笔试或者面试的总结 之 一 (1)在笔试或者面试中常常会被问道,strcpy  memmove memcpy 函数的实现.有时也会问你STL 中string的 split 和 trim的实现.有的 ...

  7. Qt按ESC关闭模态对话框不触发closeEvent()问题解析(ESC默认调用的是reject()函数,所以必须覆盖这个函数才会有效果)good

    事情是这样的:今天调试窗体,突然发现按ESC键居然跳过closeEvent()关闭了对话框!我的关闭判断都在closeEvent()里,这直接导致非正常关闭了正在进行的工作.先重建下场景: 调用处: ...

  8. iPhone不为人知的功能常用技巧,看完后才发现很多用iPhone的人实在是愧对乔布斯! - imsoft.cnblogs

    很多人花了四五千买部苹果,结果只用到四五百块钱的普通手机功能. iPhone不为人知的功能,常用技巧: 网上搜集整理的iPhone快捷键操作,虽然表面上iPhone按键只有一个HOME键,大部分操作都 ...

  9. 大多数人可能都不会使用socketTimeout,看了底层才知道一直都做错了

    前几天一个机房网络抖动,引发了很多对外请求的超时问题,在发生问题排查日志的时候,发现了这么一个现象,httpclient我们的请求超时时间并没有按照我们的设置报超时异常 我们的大概配置如下: Requ ...

  10. 看懂插入才算看懂redis跳表

    跳表的数据结构 forward相当于9之于8,12之于8 插入算法流程: 1.初始化两个数组update和rank数组:update表示每一层的前继节点.rank表示update节点到头结点的距离(用 ...

随机推荐

  1. SSM整合的所有配置(配置文件)

    mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE co ...

  2. 被吐槽 GitHub仓 库太大,直接 600M 瘦身到 6M,这下舒服了

    大家好,我是小富- 前言 忙里偷闲学习了点技术写了点demo代码,打算提交到我那 2000Star 的Github仓库上,居然发现有5个Issues,最近的一条日期已经是2022/8/1了,以前我还真 ...

  3. day14:列表/集合/字典推导式&生成器表达式&生成器函数

    推导式 推导式的定义: 通过一行循环判断,遍历一系列数据的方式 推导式的语法: val for val in Iterable 三种方式: [val for val in Iterable] {val ...

  4. openGauss Datakit安装部署

    一.问题描述:目前找不到任何关于opengauuss Datakit安装部署的文档,自己来尝试踩坑. DataKit是一个以资源(物理机,数据库)为底座的开发运维工具,将上层的开发运维工具插件化,各插 ...

  5. OpenAI ChatGPT 能取代多少程序员的工作?导致失业吗?

    阅读原文:https://bysocket.com/openai-chatgpt-vs-developer/ ChatGPT 能取代多少程序员的工作?导致我们程序员失业吗?这是一个很好的话题,我这里分 ...

  6. Centos7.x 安装配置Web性能压力测试工具Siege

    一.简介 Siege是一款开源的压力测试工具,设计用于评估WEB应用在压力下的承受能力.可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重 ...

  7. 「学习笔记」AC 自动机

    「学习笔记」AC 自动机 点击查看目录 目录 「学习笔记」AC 自动机 算法 问题 思路 代码 例题 Keywords Search 玄武密码 单词 病毒 最短母串 文本生成器 背单词 密码 禁忌 前 ...

  8. 手机app解包

    1.将在网上下载的手机软件放入apps 2.启动 3.查看结果 urls里是网址

  9. 基于Quartz的可视化UI操作组件GZY.Quartz.MUI更新说明(附:在ABP中集成GZY.Quartz.MUI可视化操作组件)

    前言 时隔2年.(PS:其实陆陆续续在优化,不过没发博客).. .本组件又迎来了新的更新... 很久没更新博客了.生了娃,换了工作单位,太忙了..实在抱歉 NET Core 基于Quartz的UI可视 ...

  10. cv学习总结(11.21-11.27)

    本周彻底完成了CNN的全部内容,包括CNN的原理,代码实现等.CNN是一种神经网络的framework,跟connected_layer相比,更加侧重于能够保持原来的空间结构不变:我们输入的图片是一个 ...