读书笔记--C陷阱与缺陷(七)
第七章
1.null指针并不指向任何对象,所以只用于赋值和比较运算,其他使用目的都是非法的。
误用null指针的后果是未定义的,根据编译器各异。
有的编译器对内存位置0只读,有的可读写。
书中给出了一种判断编译器如何处理内存0的代码:
#include <stdio.h>
int main()
{ char *p;
p=NULL;
printf("location 0 contains: %d\n", *p); return ;
}
在禁止读内存0的机器上,程序会执行失败。有的机器上,却可以10进制打印内存0存储的字符内容。
笔者试了下codeblocks,程序执行失败,即禁止读内存0.
2.移位运算符
在向右移位时,会考虑空出的位是0填充,还是符号位填充?
如果移位对象是无符号数,毫无疑问是0填充;若是有符号数,可以是0填充也可以是符号位。
具体负数的移位操作下次专门写一篇。
移位操作的位数限制在被移位对象的长度内。
即若int型是32位,n是int型,那么[0-31]的移位时合法的:n<<31, n<<0
3.大小写转换
库函数 toupper tolower起初被定义为:
#define toupper(c) ((c)+'A'-'a')
#define tolower(c) ((c)+'a'-'A')
但是这个宏定义没考虑输入的大小写是否正确。
如下程序将不能工作:
int c;
while ((c)= getchar() != EOF)
putchar(tolower(c));
应该改为:
int c;
while ((c)= getchar() != EOF)
putchar(isupper(c) ? tolower(c) : c);
或者重写函数,如 toupper:
int toupper (int c)
{
if (c >= 'a' && c <= 'z')
return c + 'A'-'a';
return c;
}
这样的程序更加健壮,就是函数调用相比宏定义更加浪费开销。
至此 C陷阱与缺陷 的读书笔记就结束了,感觉该书知识有点旧但讲的很有深度,对于大型C项目和多平台项目有启发!
读书笔记--C陷阱与缺陷(七)的更多相关文章
- 读书笔记--C陷阱与缺陷(一)
要参与C语言项目,于是作者只好重拾C语言(之前都是C++,还是C++方便). 看到大家都推荐看看 C陷阱与缺陷(C traps and pitfalls),于是好奇的开始了这本书的读书之旅. 决定将 ...
- 读书笔记--C陷阱与缺陷(二)
第二章 1. 理解函数声明 书中分析了复杂的类型声明方式,也说明了使用typedef声明会更好理解,推荐大家使用typedef进行函数声明. 书中类型分析一层一层挖掘,让读者可以理解多层嵌套的类型含义 ...
- 读书笔记--C陷阱与缺陷(六)
第六章 1.预处理器:预处理器先对代码进行必要的转换处理,简化编程者的工作. 它的重要原因有以下两点: a. 假如要将程序中出现的所有实例都加以修改,但希望只改动程序一处数值,重新编译实现. 预处理器 ...
- 读书笔记--C陷阱与缺陷(五)
第五章 第五章干货也偏少,但是几个练习题还不错,写出来大家分享下: 1.当一个程序异常终止时,程序输出的最后几行常常会丢失,原因是什么? 我们能够采取怎么样的措施来解决这个问题? 答:因为异常终止的程 ...
- 读书笔记--C陷阱与缺陷(四)
第四章 1. 连接器 C语言的一个重要思想就是分别编译:若干个源程序可在不同的时候单独进行编译,恰当的时候整合到一起. 连接器一般与C编译器分离,其输入是一组目标模块(编译后的模块)和库文件,输出是一 ...
- 读书笔记--C陷阱与缺陷(三)
第三章 1. 指针与数组 书中强调C中数组注意的两点: 1) C语言只有一维数组,但是数组元素可以是任何类型对象,是另外一个数组时就产生了二维数组.数组大小是常数(但GCC实现了变长数组..) ...
- R in action读书笔记(7)-第七章:基本统计分析(下)
7.3相关 相关系数可以用来描述定量变量之间的关系.相关系数的符号(±)表明关系的方向(正相关或负相关),其值的大小表示关系的强弱程度(完全不相关时为0,完全相关时为1).除了基础安装以外,我们还将使 ...
- R in action读书笔记(6)-第七章:基本统计分析(中)
7.2 频数表和列联表 > library(vcd) > head(Arthritis) ID Treatment Sex Age Improved 1 57 Treated Male 2 ...
- R in action读书笔记(5)-第七章:基本统计分析
7.1描述性统计分析 > vars<-c("mpg","hp","wt") > head(mtcars[vars]) ...
随机推荐
- debian7编译安装tengine添加lua和ldap模块
1.安装开发环境 # aptitute update # aptitude install -y build-essential # aptitude install -y libldap2-dev ...
- 单点登录(七)-----实战-----cas server去掉https验证
我们在搭建cas中已经说过如果不搭建https证书体系的需要去掉https的验证: 单点登录(二)----实战------简单搭建CAS---测试认证方式搭建CAS 因为cas4.2以上的代码做了一些 ...
- 解题:HDU 4609 Three Idiots
题面 要求组合的方法显然我们需要对桶卷积,即设$F(x)=\sum\limits_{i=1}^{maxx}x^{cnt[i]}$,然后我们初步的先把$F^2(x)$卷出来,表示选两条边.然后我们发现如 ...
- 使用kafka消息队列解决分布式事务(可靠消息最终一致性方案-本地消息服务)
微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务 本文转自:http://skaka.me/blog/2016/04/21/springcloud1/ 不同于单一 ...
- 01 C++ 多线程入门实例
1.可复用的完整实例 #include <iostream> #include <thread> #include <mutex> using namespace ...
- ajax的坑
$('#mkcode').on('click',function(){ $.ajax({ type : 'POST', url : '__URL__/mkcode', data : {}, dataT ...
- JSON学习笔记(总结自w3school)
1. JSON是一种文本. 2. JSON即JavaScript Object Notation(JavaScript对象表示法). JSON用来存储和交换文本信息. JSON比xml更小, 更快, ...
- React.js基础入门
本文主要是针对React的一些demo教程.参考了菜鸟教程中的react教程,做了一些总结.Demo的下载链接是 https://github.com/RealAndMe/react-demo 下面要 ...
- 基本控件文档-UILabel属性
CHENYILONG Blog 基本控件文档-UILabel属性 Fullscreen UILabel属性技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http ...
- caffe的特殊层
每次写博客都带有一定的目的,在我看来这是一个记录的过程,所以尽量按照循序渐进的顺序逐步写,前面介绍的CNN层应该是非常常用的,这篇博客介绍一下某些特殊的layer,但是由于特殊的layer都带有一定的 ...