什么是函数?从定义来看,函数就是一段可以重复使用的代码块,比如下面这样
void hanshu()
{
int a = 0;
int b = 3;
}
这时候就应该有人要跳出来了,这是什么**!确实,作为一个强烈反对屎山代码存在的编程者来说,一个好的函数应该是一个有着合理命名,并且功能紧凑的功能块,而不仅只是一份可以重复调用执行的代码。像下面这个一眼能看出其功能和实现逻辑才算是一个好函数。
int add(int num0, int num1)
{
return (num0 + num1);
}
有了以上的认识还不够,我们应该更加剖根究底的看一下。总的来说,计算机是一个可以输入输出的系统,每个具体的项目产品也是,函数作为这座大山的基本组成单位,自然也是个系统。函数既然是一个系统,则就应该有一个系统视角的认识和理解。
 
传统意义来讲,一个函数的输入,就是它的形参,一个函数的输出就是它的返回值,对上面Add()函数来说,num0num1就是输入,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. arc076f F - Exhausted?

    ARC076 F - Exhausted? [题目大意] \(有m个座位,分别位于坐标为1,2,3,...,m的地方:n个客人,第i位客人只坐位于[0,li]∪[ri,m]的座位.每个座位只能坐一个人 ...

  2. 介绍一下js垃圾回收机制

    JavaScript中的垃圾回收机制负责自动管理内存,回收不再使用的对象所占用的内存空间.在JavaScript中,开发者不需要显式地分配和释放内存,垃圾回收器会自动完成这些操作.以下是关于JavaS ...

  3. NTP 4.2.6p5版本导致多个系统安全漏洞

    问题描述:通过漏洞扫描发现NTP 4.2.6p5版本导致多个系统漏洞,需要升级版本更高的ntp,一般刚开始都是yum直接装ntp包,现在需要重新卸载安装源码包 下载链接:http://distfile ...

  4. 回车,换行,转义字符“\r”,“\n”是什么关系?

    1."回车"这个名词的来历. 关于"回车键"的来历,还得从机械英文打字机说起.在机械英文打字机上,有一个部件叫"字车",每打一个字符(原为单 ...

  5. 使用Vue.js实现文字跑马灯效果

    实现文字跑马灯效果,首先用到 substring()截取 和 setInterval计时器 clearInterval()清除计时器 效果如下: 实现代码如下: <!DOCTYPE html&g ...

  6. docker未授权攻击利用复现

    环境配置 受害机:CentOS 攻击者:kali 配置docker配置文件,使得测试机存在未授权访问 vim /usr/lib/systemd/system/docker.service 原本[Ser ...

  7. 5219. 【GDOI2018模拟7.10】B

    5219. [GDOI2018模拟7.10]B 题目大意: 考试想法: 正解: 代码: 题目大意: 现在有一个字符串 s s s 当 s [ i ] s[i] s[i]为 I I I时 a n s [ ...

  8. 33-module

    const { resolve } = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') module. ...

  9. vue2中使用composition-api

    vue2中使用composition-api https://juejin.cn/post/6874927606820274184 vue3.0 watch 函数 https://www.jiansh ...

  10. Wine运行问题 希沃-汉字卡无法显示

    在wine环境下运行希沃白板5,汉字卡无法正常显示: 这个模块是我之前参与开发的模块,过了5年还有点印象. 大概原理是获取字体库中字符的笔画路径GraphicsPath,根据里面的路径点集PathPo ...