问:如何在源文件中合理分配函数? 答:通常,相关的函数放在同一个文件中。有时候(例如开发库的时候),一个源文件(自然也

就是一个目标文件)放一个函数比较合适。有时候,尤其是对某些程序员,太多的源文件可能 会很麻烦,将多数以至所有的程序都放入少数几个大的源文件中也很诱人,甚至也是合适的。 希望用static关键字限制某些函数或全局变量的作用域时,源文件的分配就有更多限制了:静 态函数和变量以及共享它们的函数都必须在同一个源文件中。

问:用if(!strcmp(s1, s2))比较两个字符串是否相等是个好风格吗? 答:这并不是个很好的风格,尽管这是个流行的习惯用法。如果两个字符串相等,这个测试返回

真,但!(“非”)的使用容易引起误会,以为测试不相等情况。 另一个选择是定义一个宏:

        #define Streq(s1, s2) (strcmp((s1), (s2)) == 0)

然后这样使用:

        if(Streq(s1, s2))

另一种选择(可以防止宏的滥用,参见问题10.2)是定义

        #define StrRel(s1, op, s2) (strcmp(s1, s2) op 0)

然后你可以这样使用:

        if(StrRel(s1, ==, s2)) ...
if(StrRel(s1, !=, s2)) ...
if(StrRel(s1, >=, s2)) ...

问:为什么有的人用if(0 == x)而不是if(x == 0)?

答:这是用来防止一个常见错误的小技巧:

if(x = 0) 如果你养成了把常量放在==前面的习惯,那么当你意外地把代码写成了:

if(0 = x) 编译器就会报错。显然,一些人会觉得记住倒转测试比记住输入两个=号容易。(的确,就 算是经验老道的程序员有时也会错把==写成=。)当然这个技巧只对和常量比较的情况有用。

另一方面,有的人又觉得这样倒转的测试既难看又影响注意力,因而提出应该让编译器 对if(x = 0)报警。(实际上,很多编译器的确对条件式中的赋值报警,当然如果你真的需 要,你总是可以写if((x = expression))或if((x = expression)!= 0)。

问:为什么有些代码在每次调用printf前增加了类型转换(void)? 答:printf确实有返回值(输出的字符个数或错误码),但几乎没有谁会去检验每次调用的返

回值。由于有些编译器和lint对于被丢弃的返回值会报警告,显式地用(void)作类型转换相当 于说:“我决定忽略这次调用的返回值,请继续对于其他(也许不慎)忽略返回值的情况提出 警告”。通常,(void)类型转换也用于strcpy和strcat的调用,它们的返回值从没有什么惊 人之处。

C程序设计风格的更多相关文章

  1. 编写优质无错C程序秘诀!《经验谈》

    这里我将陆续给大家载出我在以前学习和编写c代码时遇到的问题和解决方法.学习的心得,有些是经过查询一些曾经参加微软microsoft的开发小组的老程序员的书籍和资料后提供给大家! 首先,当发现错误时,要 ...

  2. 学而精计算机公共基础学习之路TEST2(程序设计基础)

    程序设计基础 程序设计方法与风格 1.程序设计方法 程序设计: 指设计.编制.调试程序的方法和过程. 程序设计方法是研究问题求解如何进行系统构造的软件方法学.常用的程序设计方法有:结构化程序设计方法. ...

  3. Efficient&Elegant:Java程序员入门Cpp

    最近项目急需C++ 的知识结构,虽说我有过快速学习很多新语言的经验,但对于C++ 老特工我还需保持敬畏(内容太多),本文会从一个Java程序员的角度,制定高效学习路线快速入门C++ . Java是为了 ...

  4. CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构,通用对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程序体系规范

    CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构,通用对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程序体系规 ...

  5. 计算机、程序和java概述

    1.1 计算机.程序和java概述计算机包括硬件(hardware)软件(software)两部分.硬件包括计算机中看得见的物理部分,软件提供看不见的指令,指令控制硬件并且使得硬件完成特定的任务.一台 ...

  6. REST设计风格:你写的 RESTful API 到第几层了?

    理解REST 在理解其真正概念前,我们先来明确: REST它的核心思想是面向资源的抽象(相对于RPC就是面向过程抽象),它是一种设计风格的指导,而非具有较强约束的协议. REST源于Roy Thoma ...

  7. 【C语言】第2章 算法 — 程序的灵魂

    第2章 算法 - 程序的灵魂 一个程序主要包括以下两方面的信息: 对数据的描述.在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式 也就是数据结构(data structure) 对操作的描 ...

  8. 软件工程导论-目录-K-T+RJ大

    目录 10 第1章 软件工程学概述/1 19 1.1 软件危机/1 19 1.1.1 软件危机的介绍/1 19 1.1.2 产生软件危机的原因/3 21 1.1.3 消除软件危机的途径/4 22 1. ...

  9. TCPL 札记

    1.函数原型符合设计要求,函数定义符合认知规律,做到见名知义,最少词汇量包含最大的信息量. 2.合理运用空行提高代码的可读性.从框架上来说有: 变量定义 初始化变量 处理 输出 返回值 3.采用伪码的 ...

随机推荐

  1. ubuntu 制作本地yum仓库

    ubuntu 制作本地yum仓库 笔者: 张首富 W X: y18163201(请备注) qq群:895291458 时间:2019-01-31晚 今天到某银行进行软件部署的时候,碰到所有电脑都不允许 ...

  2. 是true还是false呢?

    古来圣贤皆寂寞 惟有[努]者留其名 ---[努]原文:饮 先总结一个小知识点:0.null.NaN.undefined."" 转成布尔值为false 其他则一律返回true 1.首 ...

  3. 第四十章 POSIX条件变量

    条件变量 当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了 例如一个线程访问队列时,发现队列为空,它只能等待,只到其它线程将一个节点添加到队列中.这种情况就需要用到条件 ...

  4. 学习笔记55_Nhibernate

    另一种ORM框架 1.添加各种dll 2.添加配置信息,根据文档直接复制粘贴.config //一般下载Nhibernate-3.0.0.Alpha2-bin包,会有Configuration_Tem ...

  5. js基础总结02--字符串操作

    1.字符串中对单个字符位置的操作 indexOf(char); 从左往右查找,返回匹配到的第一个字符的位置,没有匹配则返回-1 lastiIndexOf(char); 从右往左查找,返回匹配到的第一个 ...

  6. Promise对象及它在js中的执行顺序

    关于Promise对象的学习及它的执行顺序 学习阮一峰老师的ES6入门后的记录 1.promise的定义 promise是一个对象,通常包裹着一个异步操作,promise对象提供一些接口的方法,返回一 ...

  7. 由浅入深——从ArrayList浅谈并发容器

    原创作品转载请附:https://www.cnblogs.com/superlsj/p/11655523.html 一.一个案例引发的思考 public class ArrayListTest { p ...

  8. C++总结(1)keywords to the class

    目录 Chapter 1.关于类的关键字 1. class,struct与union 2.private,public与protected 3.friend 4.virtual 5.const 6.i ...

  9. ios input输入不了

    在项目中遇到了一个问题就是input输入框在安卓可以输入,而在ios输入不了 经过百度,调试发现,在ios中input默认是有user-select: none;属性把input输入框禁用了,将其删除 ...

  10. 阿里云开源 image-syncer 工具,容器镜像迁移同步的终极利器

    为什么要做这个工具? 由于阿里云上的容器服务 ACK 在使用成本.运维成本.方便性.长期稳定性上大大超过公司自建自维护 Kubernets 集群,有不少公司纷纷想把之前自己维护 Kubernetes ...