读K&R之幻数、返回值和参数传递

Dennis M. Ritchie

直到不久前,我都不曾认真地了解过C。大学课堂上学习过C++,在那段不长的时间里,学到的东西一直支撑着我对C的认知。等工作五年后,我重新学习C时,发现自己好生浅薄。就在自己还在读《The C Programming Language》的第二章时,网络上传来了Dennis M. Ritchie过世的消息。大师已逝,他所留下的知识将会继续惠泽着后人。我把阅读《The C Programming Language》所作的笔记整理出来,希望更多的人能够学习到Dennis M. Ritchie所建立的知识,这也算是对大师的一种纪念。

关于Magic Number

在程序中使用“幻数”是个坏习惯,它几乎不能提供任何信息。要避免这个问题,就是使用#define指令把符号名定义为一个特定的字符串。这使我想起来了在《深入Java虚拟机》一书中看到的一段话:

例如每个class文件必须是以四个同样的字节开始:魔数0xCAFEBABE。这个魔数的用处是让class文件分析器很容易分辨出某个文件有明显问题而加以拒绝。1

上面的“幻数”与“魔数”应该都是英文术语magic number的翻译,我把它理解成一个有特定意义的数字,这个数字没有名字,没人知道它代表什么意思,因此阅读程序代码的人就可能糊涂。——当然,0xCAFEBABE不会有人去读它,我只是想到了magic number这个词而已。

关于返回值

通常情况下,main函数返回值为0表示正常结束,非0表示出现异常情况或出错结束条件。

那么对于一般函数,返回值有什么约定俗成的规则吗?我想到了 Linux kernel coding style 中的两段话:

Functions can return values of many different kinds, and one of the most common is a value indicating whether the function succeeded or failed. Such a value can be represented as an error-code integer (-Exxx = failure, 0 = success) or a “succeeded” boolean (0 = failure, non-zero = success).

Functions whose return value is the actual result of a computation, rather than an indication of whether the computation succeeded, are not subject to this rule. Generally they indicate failure by returning some out-of-range result. Typical examples would be functions that return pointers; they use NULL or the ERR_PTR mechanism to report failure.

上面的文字按照是否表示执行成功来将返回值分为两大类,前者又区分为需要详细的错误码和只需要成功与否两种情形,后者则是使用NULL或ERR_PTR来标识失败。

关于参数传递

所有函数参数都是“通过值”传递,传递给被调用函数的参数值存放在临时变量中,而不是存放在原来的变量中。因此,被调用函数不能直接修改主调用函数中变量的值,而只能修改其私有的临时副本的值。

如果要让被调用函数能够修改主调用函数的变量,那么调用者需要向被调用函数提供设置值的变量的地址,而被调用函数则需要将对应的参数声明为指针类型,并通过它间接访问变量。

当把数组名作为参数时,传递给函数的值时数组起始元素的位置或地址,–它并不赋值数组元素本身。

参考文献

October 15th, 2011 in

Software| tags: C

幻数java题_诗意代码 – PoemCode相关推荐

  1. 幻数java题_幻数

    幻数--上下文里出现的字面常量. 幻数带来的主要问题是它们没有(抽象)语义.当我们阅读和维护带有幻数的代码时,不得不去一个个地搞清楚每个光秃秃的量到底代表的是什么意思.没错,这样也能勉强度日,但带来的 ...

  2. 幻数java题_关于数组中的幻数?:数组中的幻数? -C ++

    我是一个相当新的程序员,如果无法轻松获得此信息,我感到抱歉,我只是无法找到它. 这是我的问题: 当您使用文字数字访问数组的特定元素时,是否被视为幻数? 例如: arrayOfNumbers[6] // ...

  3. java火山_火山代码转java源代码查看

    今天我们来研究一下火山安卓的源代码,火山安卓允许我们以本地化编程(中文代码编程)的方式来撰写安卓app,那么在生成实际要安装到安卓app的时候,它是如何进行编译处理的呢.让我们今天来一起探究一下. 首 ...

  4. 冒充java诈骗_天下代码一大抄,整个案例的搬是什么鬼!疑似冒充蚂蚁金服高级Java开发工程师?你大爷...

    写在开始 上班前的第一件事,就是码云看看有什么消息,回复下网友的问题.如果看到喜欢的项目会点进去瞅瞅,然后就开始一天的工作. 然而,这一天的工作并不开心,一个今日热门项目让自己很恼火,一开始感觉并没有 ...

  5. pmd java规则_静态代码扫描 (一)——PMD 自定义规则入门

    阅读该文章前,最好已经对 PMD 有了初步的认识和了解,可参考静态分析工具 PMD 使用说明 准备工作 首先在PMD 官网下载最新版本的文件,目前最新版本是 5.4.1. 下载 pmd-bin-5.4 ...

  6. acm java题_【转】ACM中java的使用

    ACM中java的使用 这里指的java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目. 1. 输入: 格式为:Scanner ...

  7. 幻数java题_java – 公式中的幻数

    这是一个完善的惯例,应避免使用魔法数字.但复杂的条件公式中的幻数呢?例如: int result = 0; if (level <= 50) { result = (int) (Math.pow ...

  8. java 静态分析_静态代码分析与代码质量安全

    HeartBleed Bug Heartbleed漏洞,这项严重缺陷(CVE-2014-0160)的产生是由于未能在memcpy()调用受害用户输入内容作为长度参数之前正确进行边界检查.攻击者可以追踪 ...

  9. 疯狂Java讲义_五子棋代码

    除此之外,我们还可以利用二维数组来完成五子棋.连连看.俄罗斯方块.扫雷等常见小游戏. 下面简单介绍利用二维数组实现五子棋.我们只要定义一个二维数组作为下棋的棋盘,每当一个棋手 下-步棋后,也就是为二维 ...

最新文章

  1. 《网络攻防实践》第二周作业
  2. Hystrix概述(二)
  3. 深入理解分布式技术 - 服务注册与发现背后的逻辑
  4. java 文件 缓存_JAVA缓存技术
  5. require_once的用法
  6. 如何有效的使用对话框之二
  7. 单片机ADC采样算法----消抖滤波法
  8. Android Fragment手柄后退按钮按下[重复]
  9. ch340串口驱动_敏矽微电子Cortex-M0学习笔记07-串口通信详解
  10. 视频 圆角 html,HTML div圆角制作 (来自Joomla圆角实现方法)
  11. CSDN 社区内容创作规范
  12. 放牛娃谈堆排序---(为了说明白,我重新学习了如何说“人话”)
  13. 一文读懂GPU服务器
  14. esp8266保存html文件,八,ESP8266 文件保存数据(基于Lua脚本语言)
  15. 回溯法求地图填色实验(剪枝)
  16. flutter 多渠道打包 不同环境不同包名 product flavors flavorDimensions
  17. 金蝶记账王用试算平衡表的教程
  18. 求以log2为底的对数值
  19. 一条挨踢老狗的 2017 年终总结
  20. 2018华为软件精英挑战赛总结及代码

热门文章

  1. 寻找黑道高手一起黑网站玩
  2. 自行搭建全部开源的:代码管理、缺陷跟踪、项目管理、同步云盘(二)--MeterSphere
  3. php有strock吗,PHP函数中满足条件时的类中的Echo元素
  4. 产品经理1.2_如何进行需求收集以及需求管理
  5. 【面试题】广州济达信息科技有限公司
  6. 施耐德EAE功能重点功能介绍
  7. Java动态代理、CGLIB动态代理
  8. 保安休息排序编程C语言,c语言课程设计保安值班安排系统
  9. windows7共享硬盘 虚拟机Mac访问windows7硬盘
  10. 天线效应antenna effect