读书笔记--C陷阱与缺陷(一)
要参与C语言项目,于是作者只好重拾C语言(之前都是C++,还是C++方便)。
看到大家都推荐看看 C陷阱与缺陷(C traps and pitfalls),于是好奇的开始了这本书的读书之旅。
决定将书中重要的知识点和易错点记录下来方便自己复习和他人学习~~不多说了,下面开始。
第一章:词法陷阱
- 在C语言中,符号(程序文字)之间的空白(包括空格符、制表符、换行符)将被忽略。书中举了一例:
if (x > big) big = x;
可以写成:
if
(
x
>
big
)
big
=
x
;
其实我们编码的时候已经涉及到了,比如C标准规范就要求多用空格符来对齐;过长的判断式也会分为两行书写等。
这些所谓的空白当然是被忽略了,不然编译器没法理解程序意图了。。。
2. 在词法分析中,作者指出:如果/是为判断下一个符号而读入的第一个字符,而/之后紧挨*,那么无视上下文,这两个字符都被当做一个符号/*,表示一段注释的开始。
由此可能会出现以下问题:
y = x/*p;
语句想用x除以p说指向的值,结果赋给y。但是/*被解释为注释,于是语句直接将x赋给y。
其实这样写(*p)就可以很好避免。y = x/(*p);
这种错误是有可能出现的,好在现在的IDE注释都会变色,应该容易察觉。
3. 字符和字符串:
学C语言都知道单引号表示字符,双引号表示字符串。
其实单引号引起的单字符实际上代表一个整数,该整数值对应于该字符在编译器采用的字符集的序列值。
一般采用ASCII字符集,即’a’与97(十进制)含义严格一致。
而双引号引起的字符串,代表的是一个指向无名数组起始字符的指针,该数组被双引号之间的字符串+一个额外的二进制值为0的字符’\0’(C中常用来表示结束)初始化。
书中举例:
printf(“hello world\n ”);
与
char hello[] = { ‘h’, ’e’, ‘l’, ‘l’, ‘o’, ‘ ’, ‘w’, ‘o’, ‘r’, ‘l’, ‘d’, ‘\n’, };
printf(hello); 是等效的
上面代码跑了下确实是对的,但其实将hello[]写成如下形式更有可读性。
char hello[] = {‘h’, ’e’, ‘l’, ‘l’, ‘o’, ‘ ’, ‘w’, ‘o’, ‘r’, ‘l’, ‘d’, ‘\n’, '\0'};
4. 书中还提到整型数(16/32位)的存储空间可容纳多个字符(8位),那么有的编译器允许一个字符串常量中包括
多个字符。如'yes'代替“yes”。
按照单字符的整数本质,作者做了个实验:
int t1='a';
printf("%d\n", t1);
int t11='aa';
printf("%d\n", t11);
输出结果:

97就是'a'的asc码值好理解,但是'aa'的值24929可能就是和编译器与存储方式有关系,作者暂时也没懂,有大神可以评论讲解下~~
第一章也就这些注意点了,期待第二章!
读书笔记--C陷阱与缺陷(一)的更多相关文章
- 读书笔记--C陷阱与缺陷(七)
第七章 1.null指针并不指向任何对象,所以只用于赋值和比较运算,其他使用目的都是非法的. 误用null指针的后果是未定义的,根据编译器各异. 有的编译器对内存位置0只读,有的可读写. 书中给出了一 ...
- 读书笔记--C陷阱与缺陷(二)
第二章 1. 理解函数声明 书中分析了复杂的类型声明方式,也说明了使用typedef声明会更好理解,推荐大家使用typedef进行函数声明. 书中类型分析一层一层挖掘,让读者可以理解多层嵌套的类型含义 ...
- 读书笔记--C陷阱与缺陷(六)
第六章 1.预处理器:预处理器先对代码进行必要的转换处理,简化编程者的工作. 它的重要原因有以下两点: a. 假如要将程序中出现的所有实例都加以修改,但希望只改动程序一处数值,重新编译实现. 预处理器 ...
- 读书笔记--C陷阱与缺陷(五)
第五章 第五章干货也偏少,但是几个练习题还不错,写出来大家分享下: 1.当一个程序异常终止时,程序输出的最后几行常常会丢失,原因是什么? 我们能够采取怎么样的措施来解决这个问题? 答:因为异常终止的程 ...
- 读书笔记--C陷阱与缺陷(四)
第四章 1. 连接器 C语言的一个重要思想就是分别编译:若干个源程序可在不同的时候单独进行编译,恰当的时候整合到一起. 连接器一般与C编译器分离,其输入是一组目标模块(编译后的模块)和库文件,输出是一 ...
- 读书笔记--C陷阱与缺陷(三)
第三章 1. 指针与数组 书中强调C中数组注意的两点: 1) C语言只有一维数组,但是数组元素可以是任何类型对象,是另外一个数组时就产生了二维数组.数组大小是常数(但GCC实现了变长数组..) ...
- <读书笔记>软件调试之道 :问题的核心-如何修复缺陷
声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! 修复缺陷 对于一个好的修复来说,不仅仅是让软件运行正确,还需要为将来奠定基础.一 ...
- C陷阱和缺陷学习笔记
这段时间把<C陷阱和缺陷>看了,没时间自己写总结.就转一下别人的学习笔记吧http://bbs.chinaunix.net/thread-749888-1-1.html Chapter 1 ...
- <读书笔记>软件调试之道 :问题的核心-诊断
声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记. 不要急于动手! 尽管可以利用各种工具和技术以及软件自身查找缺陷,但是你最重要的财富是你的智 ...
随机推荐
- 迭代器 Iterator
迭代器 Iterator 2016-5-7 可以这样说,迭代器统一了对容器的访问方式. 考虑这样的情景:原本是对着List编码,但是后来发现需要把相同的代码用于Set.我们需要一种不关心容器类型 而能 ...
- OI内的排列与组合(简单版)
§1基本原理 △让我们来看下面问题: 从甲地到乙地,可以乘火车,也可以乘汽车,还可以乘轮船.一天中,火车有4班,汽车有2班,轮船有3班.那么,一天中乘坐这些交通工具从甲地到乙地共有多少种不同走法?△分 ...
- Jenkins中的一些问题解决(~~不断更新~~)
请使用ctrl+F,查询页面中你需要查找的错误信息(注意空格的输入) 1.错误"error fetching remote repo origin" 本地有多个sshkey,导致构 ...
- (转)Linux服务器安装配置tomcat
这里首先说明下,Linux下的Tomcat没有32位和64位的区分. tomcat是分windows版本与linux版本的,windows版本一般以exe或者zip格式:linux版本一般以tar.g ...
- Java栈与堆 (转)
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快,仅次于直接位于C ...
- java中方法的参数传递机制
问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个 ...
- 解决input[type=file]打开时慢、卡顿问题
经过测试发现,在mac里面safari.Firefox.Chrome(opera不知道为啥老闪退)都没有卡顿问题 在windows里面,Firefox不卡顿,只有Chrome卡顿. 然而,这个插件是从 ...
- 初学 Python(十三)——匿名函数
初学 Python(十三)--匿名函数 初学 Python,主要整理一些学习到的知识点,这次是匿名函数. # -*- coding:utf-8 -*- #关键字lambda定义的函数都是匿名函数 #做 ...
- 一步一步深入理解Dijkstra算法
先简单介绍一下最短路径: 最短路径是啥?就是一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第 ...
- 使用VMware安装CentOS
使用VMware安装CentOS 第1步:首先安装VMware Workstation,只需点下一步即可,安装过程略 第2步:文件 → 新建虚拟机 或 直接点击 创建新的虚拟机 图标 第3步:选择 典 ...