C程序设计风格
问:如何在源文件中合理分配函数? 答:通常,相关的函数放在同一个文件中。有时候(例如开发库的时候),一个源文件(自然也
就是一个目标文件)放一个函数比较合适。有时候,尤其是对某些程序员,太多的源文件可能 会很麻烦,将多数以至所有的程序都放入少数几个大的源文件中也很诱人,甚至也是合适的。 希望用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程序设计风格的更多相关文章
- 编写优质无错C程序秘诀!《经验谈》
这里我将陆续给大家载出我在以前学习和编写c代码时遇到的问题和解决方法.学习的心得,有些是经过查询一些曾经参加微软microsoft的开发小组的老程序员的书籍和资料后提供给大家! 首先,当发现错误时,要 ...
- 学而精计算机公共基础学习之路TEST2(程序设计基础)
程序设计基础 程序设计方法与风格 1.程序设计方法 程序设计: 指设计.编制.调试程序的方法和过程. 程序设计方法是研究问题求解如何进行系统构造的软件方法学.常用的程序设计方法有:结构化程序设计方法. ...
- Efficient&Elegant:Java程序员入门Cpp
最近项目急需C++ 的知识结构,虽说我有过快速学习很多新语言的经验,但对于C++ 老特工我还需保持敬畏(内容太多),本文会从一个Java程序员的角度,制定高效学习路线快速入门C++ . Java是为了 ...
- CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构,通用对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程序体系规范
CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构,通用对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程序体系规 ...
- 计算机、程序和java概述
1.1 计算机.程序和java概述计算机包括硬件(hardware)软件(software)两部分.硬件包括计算机中看得见的物理部分,软件提供看不见的指令,指令控制硬件并且使得硬件完成特定的任务.一台 ...
- REST设计风格:你写的 RESTful API 到第几层了?
理解REST 在理解其真正概念前,我们先来明确: REST它的核心思想是面向资源的抽象(相对于RPC就是面向过程抽象),它是一种设计风格的指导,而非具有较强约束的协议. REST源于Roy Thoma ...
- 【C语言】第2章 算法 — 程序的灵魂
第2章 算法 - 程序的灵魂 一个程序主要包括以下两方面的信息: 对数据的描述.在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式 也就是数据结构(data structure) 对操作的描 ...
- 软件工程导论-目录-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. ...
- TCPL 札记
1.函数原型符合设计要求,函数定义符合认知规律,做到见名知义,最少词汇量包含最大的信息量. 2.合理运用空行提高代码的可读性.从框架上来说有: 变量定义 初始化变量 处理 输出 返回值 3.采用伪码的 ...
随机推荐
- vue学习笔记(一)入门
前言 随着前端不断的壮大,许多公司对于前端开发者的需求也越来越多了,作为一名优秀的前端工程师,如果连vue和react都不会的话,那真是out了,为什么那么说呢?这是我在招聘网站上截的一张图,十家公司 ...
- 是true还是false呢?
古来圣贤皆寂寞 惟有[努]者留其名 ---[努]原文:饮 先总结一个小知识点:0.null.NaN.undefined."" 转成布尔值为false 其他则一律返回true 1.首 ...
- oracle数据库锁表,什么SQL引起了锁表?ORACLE解锁的方法
--查询数据库锁表记录 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.l ...
- [Java] 生成二维码源码,可以在二维码中间加logo,底部可以加文字介绍
链接:https://pan.baidu.com/s/1bc1h-ix-No-2o9Ysd4_B3Q提取码:0ad4
- C语言I作业06
问题 答案 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-4/homework/9888 我在 ...
- [Hadoop]HDFS机架感知策略
HDFS NameNode对文件块复制相关所有事物负责,它周期性接受来自于DataNode的HeartBeat和BlockReport信息,HDFS文件块副本的放置对于系统整体的可靠性和性能有关键性影 ...
- C#之委托如此简单
近期和几位做嵌入式开发的朋友闲聊过程中,一位朋友抱怨到:这C#太难用了,我想在N个窗体(或者是N个用户组件之间)传递值都搞不定,非得要定义一个全局变量来存储,然后用定时器来刷新值,太Low了.我急切的 ...
- NOIP模拟 5
考试的时候相当浮躁,而且脑子并不工作 T1看了几眼,觉得没思路,先skip T2一打眼,满足条件的最大值,二分!(然后就死了,根本没想有没有单调性) T3找了半天规律,一开始自己手模的K3都过不了样例 ...
- C语言:大数取余
大数取余数(数组) 今天做学校的oj时遇到一题,问题可见一下截图: 查遍各大论坛,都没有遇到合适的方法,普通方法不可用,要采用数组的形式. 被除数超过long long类型,不能采用常规思路,否则会出 ...
- ubuntu开机自启动服务
ubuntu下一个用来管理开机自启动服务的程序,今天在ss vps上安装时老是提示这个错误,百度后,下面的这个方法可行: vi /etc/apt/source.list 输入i,进入Insert模式 ...