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

就是一个目标文件)放一个函数比较合适。有时候,尤其是对某些程序员,太多的源文件可能 会很麻烦,将多数以至所有的程序都放入少数几个大的源文件中也很诱人,甚至也是合适的。 希望用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. C函数库stdio.h概况

    库变量 size_t    这是无符号整数类型,它是 sizeof 关键字的结果. FILE      这是一个适合存储文件流信息的对象类型. fpos_t   这是一个适合存储文件中任何位置的对象类 ...

  2. CSPS模拟 49

    连续退步2333 我怎么这么不稳啊2333 看看人家大敛,天天AK 考后改了改sb错误就变40+80+100了... 但愿我的实力还在? T1 养fa 拿到题心想,这次一定把T1切了 开始研究这个见了 ...

  3. Ubuntu16.04下nvidia驱动+nvidia-docker+cuda9+cudnn7安装

    一.宿主机安装nvidia驱动 打开终端,先删除旧的驱动: sudo apt-get purge nvidia* 禁用自带的 nouveau nvidia驱动 sudo gedit /etc/modp ...

  4. windows下离线安装mysql8.0服务(支持多个安装,端口不同就可以)

      1.官网下载 mysql文件.官网下载链接:https://dev.mysql.com/downloads/mysql/ 选择mysql下载的系统版本. 此处可以下载MSI安装包,图简单的朋友可以 ...

  5. 三分钟学会Redis在.NET Core中做缓存中间件

    大家好,今天给大家说明如何在.NET Core中使用Redis,我们在想要辩论程序的好与坏,都想需要一个可视化工具,我经常使用的是一位国内大牛开发的免费工具,其Github地址为: https://g ...

  6. P4409 [ZJOI2006]皇帝的烦恼(20190922B)(乱搞)

    考场历程十分艰辛啊... 第一题没切掉,还浪费了很长时间,就是一个裸的最小生成树,但是因为可恶的distance为关键字莫名其妙查错了10min.... 本题先乱搞了一下,过了样例 然后看第三题,可写 ...

  7. VM安装CentOS系统

    本篇文章主要介绍了VMware安装Centos7超详细过程(图文) 1.软硬件准备 软件:推荐使用VMwear,我用的是VMwear 12 镜像:CentOS7 ,如果没有镜像可以在官网下载 :htt ...

  8. SSM学习成果总结,图书管理系统进行三层整合

    一:先看一下效果图 二:目录结构  三:pojo package com.zh.pojo; import lombok.AllArgsConstructor; import lombok.Data; ...

  9. js 把数组中每个元素的某个字段取出

    方法一:map() let cities = [ {city:"北京",bOn:false}, {city:"上海",bOn:false}, {city:&qu ...

  10. Look into Bitmap images

    What's a Bitmap image? I'm not going to explain the differences between raster and vector images, no ...