要参与C语言项目,于是作者只好重拾C语言(之前都是C++,还是C++方便)。

 看到大家都推荐看看  C陷阱与缺陷(C traps and pitfalls),于是好奇的开始了这本书的读书之旅。

决定将书中重要的知识点和易错点记录下来方便自己复习和他人学习~~不多说了,下面开始。

第一章:词法陷阱

  1. 在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陷阱与缺陷(一)的更多相关文章

  1. 读书笔记--C陷阱与缺陷(七)

    第七章 1.null指针并不指向任何对象,所以只用于赋值和比较运算,其他使用目的都是非法的. 误用null指针的后果是未定义的,根据编译器各异. 有的编译器对内存位置0只读,有的可读写. 书中给出了一 ...

  2. 读书笔记--C陷阱与缺陷(二)

    第二章 1. 理解函数声明 书中分析了复杂的类型声明方式,也说明了使用typedef声明会更好理解,推荐大家使用typedef进行函数声明. 书中类型分析一层一层挖掘,让读者可以理解多层嵌套的类型含义 ...

  3. 读书笔记--C陷阱与缺陷(六)

    第六章 1.预处理器:预处理器先对代码进行必要的转换处理,简化编程者的工作. 它的重要原因有以下两点: a. 假如要将程序中出现的所有实例都加以修改,但希望只改动程序一处数值,重新编译实现. 预处理器 ...

  4. 读书笔记--C陷阱与缺陷(五)

    第五章 第五章干货也偏少,但是几个练习题还不错,写出来大家分享下: 1.当一个程序异常终止时,程序输出的最后几行常常会丢失,原因是什么? 我们能够采取怎么样的措施来解决这个问题? 答:因为异常终止的程 ...

  5. 读书笔记--C陷阱与缺陷(四)

    第四章 1. 连接器 C语言的一个重要思想就是分别编译:若干个源程序可在不同的时候单独进行编译,恰当的时候整合到一起. 连接器一般与C编译器分离,其输入是一组目标模块(编译后的模块)和库文件,输出是一 ...

  6. 读书笔记--C陷阱与缺陷(三)

    第三章 1. 指针与数组 书中强调C中数组注意的两点: 1)     C语言只有一维数组,但是数组元素可以是任何类型对象,是另外一个数组时就产生了二维数组.数组大小是常数(但GCC实现了变长数组..) ...

  7. <读书笔记>软件调试之道 :问题的核心-如何修复缺陷

    声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! 修复缺陷 对于一个好的修复来说,不仅仅是让软件运行正确,还需要为将来奠定基础.一 ...

  8. C陷阱和缺陷学习笔记

    这段时间把<C陷阱和缺陷>看了,没时间自己写总结.就转一下别人的学习笔记吧http://bbs.chinaunix.net/thread-749888-1-1.html Chapter 1 ...

  9. <读书笔记>软件调试之道 :问题的核心-诊断

    声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记. 不要急于动手! 尽管可以利用各种工具和技术以及软件自身查找缺陷,但是你最重要的财富是你的智 ...

随机推荐

  1. Invert a binary tree 翻转一棵二叉树

    Invert a binary tree 翻转一棵二叉树 假设有如下一棵二叉树: 4  / \   2    7  / \   / \ 1  3 6  9翻转后: 4     /    \    7 ...

  2. 51nod_1265:四点共面(计算几何)

    题目链接 设四点为a_0~3,若共面则 (a1a0*a2a0)·a3a0=0 #include<iostream> #include<cstdio> #include<c ...

  3. (转)Linux系统安装时分区的选择

    场景:对于Linux系统的分区总是迷迷茫茫的,还是实践少,基础不牢. 以前初识Linux时,对Linux系统安装时分区的选择,一点都不了解,导致几次没法进行下一步安装,因此就静下心来,专门拿出时间研究 ...

  4. JPush 使用教程

    JPush 使用教程 自己使用的一些经验,为了方便直接从这里复制过去就行. 就当做个笔记,防止长时间忘记之后,还需要去官网看文档. 主要思路: sdk文件 + 三方依赖系统库 + 头文件 + 添加代理 ...

  5. CSS随笔2

    1. css中: a:link { /*表示普通的,未被访问的链接状态*/    color: black;} a:visited { /*表示链接被访问过后的状态*/    color: bluev ...

  6. 来一手 AOP 注解方式进行日志记录

    系统日志对于定位/排查问题的重要性不言而喻,相信许多开发和运维都深有体会. 通过日志追踪代码运行状况,模拟系统执行情况,并迅速定位代码/部署环境问题. 系统日志同样也是数据统计/建模的重要依据,通过分 ...

  7. Pandas: 如何将一列中的文本拆分为多行? | Python

    Pandas: 如何将一列中的文本拆分为多行? 在数据处理过程中,经常会遇到以下类型的数据: 在同一列中,本该分别填入多行中的数据,被填在一行里了,然而在分析的时候,需要拆分成为多行. 在上图中,列名 ...

  8. 蓝桥杯比赛关于 BFS 算法总结方法以及套路分析

    首先我们来看几道java A组的题目,都是同一年的哦!!! 搭积木 小明最近喜欢搭数字积木,一共有10块积木,每个积木上有一个数字,0~9. 搭积木规则:每个积木放到其它两个积木的上面,并且一定比下面 ...

  9. akoj-1074-人见人爱A^B

    人见人爱A^B Time Limit:1000MS  Memory Limit:65536K Total Submit:91 Accepted:55 Description 求A^B的最后三位数表示的 ...

  10. Java标识符的命名规则

    Java语言中,为各种变量.方法和类等起的名字称为标识符Java标识符的命名规则:应以字母.下划线.美元符开头后跟字母.下划线.美元符或数字Java标识符大小写敏感,长度无限制 1.java中能用作标 ...