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.采用伪码的 ...
随机推荐
- 机器阅读理解(看各类QA模型与花式Attention)
目录 简介 经典模型概述 Model 1: Attentive Reader and Impatient Reader Model 2: Attentive Sum Reader Model 3: S ...
- 学习笔记34_EF上下文管理
*上下文对象dbContext最好不要频繁的使用Using(var dbContext = new ....):那么就会产生过多的数据库交互:而且每个dbContext中村的数据,由于操作不同,数据可 ...
- SpringBoot系列:Spring Boot定时任务Spring Schedule
Spring Schedule是Spring提供的定时任务框架,相较于Quartz,Schedule更加简单易用,在中小型应用中,对于大部分需求,Schedule都可以胜任. 一.Spring Sch ...
- LNMP下zabbix_server安装部署二
上一篇中搭建完成了zabbix的web端,但是虚拟机有点问题,所以转到笔记本上来写笔记本环境 server:192.168.112.9 agent:192.168.112.8 上一篇中完成了web ...
- 1005 csp-s 60 凉凉
T1 嘟嘟噜 上来一看数据范围1e9就蒙蔽,然后不知所措的打了一个 $ O(n)$的无脑算法,由于本人真的脑小,导致O(n)的柿子推了好长时间,导致心态崩了,然后........ 今天能明白了log的 ...
- Java I/O体系从原理到应用,这一篇全说清楚了
本文介绍操作系统I/O工作原理,Java I/O设计,基本使用,开源项目中实现高性能I/O常见方法和实现,彻底搞懂高性能I/O之道 基础概念 在介绍I/O原理之前,先重温几个基础概念: (1) 操作系 ...
- ASP.NET Core 1.0: Deploy to IIS
尽管ASP.NET最新的官方文档记录了如何Deploy to IIS,但是实际操作起来依旧磕磕绊绊.官方文档地址:https://docs.asp.net/en/latest/publishing/i ...
- nyoj 114-某种序列 (python EOFError, List, append)
114-某种序列 内存限制:64MB 时间限制:3000ms 特判: No 通过数:6 提交数:13 难度:4 题目描述: 数列A满足An = An-1 + An-2 + An-3, n >= ...
- 力扣(LeetCode)单值二叉树 个人题解
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树. 只有给定的树是单值二叉树时,才返回 true:否则返回 false. 示例 1: 输入:[1,1,1,1,1,null,1] 输出:tr ...
- opencv各种小例子
图像腐蚀 #include <opencv2/highgui/highgui.hpp>//OpenCV highgui 模块头文件 ~ #include <opencv2/imgpr ...