C缺陷与陷阱 笔记
2012-11-13 23:41
197 查看
栏杆错误的两个通用原则:
首先考虑最简单情况下的特例,然后将得到的结果往后推
仔细计算边界,绝不掉以轻心
用第一个入界点和第一个出界点来表示一个取值范围
1 取值范围的大小就是上界与下界之差
2 如果取值范围为空,那么上界等于下界
3 如果取值范围为空,上界也永远不可能小于下界
求值的优先级
整数溢出
在无符号数中,没有溢出一说。所有的无符号运算都是以2的n次方为 模
一个有符号,一个无符号,有-》无
当都是有符号时,溢出就有可能发生
,而且溢出的结果是未定义的。即例如:两个非负数相加,结果相加,溢出之后变成了负的,还是状态为溢出,是不可知的。
可以强制转化为无符号数,或者已知limit.h中INT_MAX,那么也可以用 a > INT_MAX -b 来判断
为函数 main 提供返回值
return 0
如果不被用到无关紧要。但是有种处理方案是,0表示成功,非0表示失败,因此如果一个系统关注程序执行后执行失败还是成功,那么有可能得到失败的结果。因此,最好加上。
static int a
将a的作用域局限在这个源文件中
如果一个函数f需要电泳函数g,而且只有f调用g,我们我们可以把f,g放在同一个源文件中,并且声明g为static
我们可以在多个源文件中定义同名的函数g,只要所有的函数g都被定义为static,或者仅仅其中一个g不是static。
为了避免可能出现的命名冲突,如果一个函数仅仅被一个源文件中的其他函数调用,我们就应该生命他为static。
4.4 形参,实参,与返回值
在调用之前必须定义或者声明,否则默认为整数
如果函数的调用和定义分属不同的文件,那么在调用的文件中,必须声明那个函数
4.5
检查外部类型
有时候,在一个文件内声明为一种类型,而在另外一个文件内声明为另外一个类型,一般不可运行
运行的话,有可能产生错误:
4.6 头文件
5 库函数
5.1 返回整数的getchar()函数
Getchar返回的是整数,因此如果
可能产生情况:
1 合法被截断,编程EOF
2 永远无法得到EOF
3 巧合可以运行
5.2 更新顺序文件
为了保持与过去不能同时进行读写操作的程序的向下兼容性,一个输入操作之后不能随后直接紧跟一个输出操作,必须在其中插入fseek。
错误
应该为
对此,http://bbs.chinaunix.net/thread-157617-1-1.html中解释为:
fread和fwrite共用同一个缓冲区。当fread时,缓冲区装入数据。当fwrite时,数据先装入缓冲区,这时缓冲区是脏的。但是如果下一条语句是fread,则缓冲区中写入的数据将丢失。因为fread不具有回写缓冲区的功能。因此在fwrite之后使用fflush就可以将数据写回文件。fseek也具有fflush的写回功能。
缓存输出与内存分配?
使用error来检查错误
If(error)
/处理错误/
这种方法是不对的:
1 如果库函数没有失败,并没有要求error一定为0
但是如果我们这样:
Error = 0;
/调用库函数/
If(error)
/处理错误/
也是错误的,因为有可能库函数调用成功,也有可能会设置error,因为库函数可能会调用别的库函数
正确的方法应该是:
/调用库函数/
If(返回的错误值)
检查errno
库函数 signal
预处理器
不能忽视宏定义中的空格?
宏并不是语句中,对于assert是如何定义的?
宏并不是函数:参数用括号括起来,整个表达式也应该用括号括起来
但是这样也会有危险:如果里面的参数会有两次用到,而且会求值两次,这样就会导致不确定性。
而且会有可能占据大量的空间
首先考虑最简单情况下的特例,然后将得到的结果往后推
仔细计算边界,绝不掉以轻心
用第一个入界点和第一个出界点来表示一个取值范围
1 取值范围的大小就是上界与下界之差
2 如果取值范围为空,那么上界等于下界
3 如果取值范围为空,上界也永远不可能小于下界
求值的优先级
整数溢出
在无符号数中,没有溢出一说。所有的无符号运算都是以2的n次方为 模
一个有符号,一个无符号,有-》无
当都是有符号时,溢出就有可能发生
,而且溢出的结果是未定义的。即例如:两个非负数相加,结果相加,溢出之后变成了负的,还是状态为溢出,是不可知的。
可以强制转化为无符号数,或者已知limit.h中INT_MAX,那么也可以用 a > INT_MAX -b 来判断
为函数 main 提供返回值
return 0
如果不被用到无关紧要。但是有种处理方案是,0表示成功,非0表示失败,因此如果一个系统关注程序执行后执行失败还是成功,那么有可能得到失败的结果。因此,最好加上。
static int a
将a的作用域局限在这个源文件中
如果一个函数f需要电泳函数g,而且只有f调用g,我们我们可以把f,g放在同一个源文件中,并且声明g为static
我们可以在多个源文件中定义同名的函数g,只要所有的函数g都被定义为static,或者仅仅其中一个g不是static。
为了避免可能出现的命名冲突,如果一个函数仅仅被一个源文件中的其他函数调用,我们就应该生命他为static。
4.4 形参,实参,与返回值
在调用之前必须定义或者声明,否则默认为整数
如果函数的调用和定义分属不同的文件,那么在调用的文件中,必须声明那个函数
4.5
检查外部类型
有时候,在一个文件内声明为一种类型,而在另外一个文件内声明为另外一个类型,一般不可运行
运行的话,有可能产生错误:
4.6 头文件
5 库函数
5.1 返回整数的getchar()函数
Getchar返回的是整数,因此如果
可能产生情况:
1 合法被截断,编程EOF
2 永远无法得到EOF
3 巧合可以运行
5.2 更新顺序文件
为了保持与过去不能同时进行读写操作的程序的向下兼容性,一个输入操作之后不能随后直接紧跟一个输出操作,必须在其中插入fseek。
错误
应该为
对此,http://bbs.chinaunix.net/thread-157617-1-1.html中解释为:
fread和fwrite共用同一个缓冲区。当fread时,缓冲区装入数据。当fwrite时,数据先装入缓冲区,这时缓冲区是脏的。但是如果下一条语句是fread,则缓冲区中写入的数据将丢失。因为fread不具有回写缓冲区的功能。因此在fwrite之后使用fflush就可以将数据写回文件。fseek也具有fflush的写回功能。
缓存输出与内存分配?
使用error来检查错误
If(error)
/处理错误/
这种方法是不对的:
1 如果库函数没有失败,并没有要求error一定为0
但是如果我们这样:
Error = 0;
/调用库函数/
If(error)
/处理错误/
也是错误的,因为有可能库函数调用成功,也有可能会设置error,因为库函数可能会调用别的库函数
正确的方法应该是:
/调用库函数/
If(返回的错误值)
检查errno
库函数 signal
预处理器
不能忽视宏定义中的空格?
宏并不是语句中,对于assert是如何定义的?
宏并不是函数:参数用括号括起来,整个表达式也应该用括号括起来
但是这样也会有危险:如果里面的参数会有两次用到,而且会求值两次,这样就会导致不确定性。
而且会有可能占据大量的空间
相关文章推荐
- 《c陷阱和缺陷》笔记--C编译器的注释嵌套
- c陷阱与缺陷阅读笔记
- C缺陷与陷阱学习笔记
- C缺陷与陷阱(笔记)[转]
- c缺陷与陷阱笔记-第一章 词法陷阱
- 《C语言陷阱和缺陷》笔记
- c缺陷与陷阱笔记-第七章 可移植性代码
- C语言缺陷与陷阱(笔记)
- C陷阱与缺陷(C Traps and Pitfalls)--学习笔记--第一章:词法陷阱
- C语言缺陷与陷阱(笔记)
- C语言缺陷与陷阱(笔记)
- C陷阱和缺陷学习笔记
- C陷阱和缺陷学习笔记
- c缺陷与陷阱笔记-第四章 连接
- c陷阱和缺陷学习笔记
- C陷阱与缺陷笔记
- C语言缺陷与陷阱(笔记)
- C的陷阱和缺陷研读笔记02
- C陷阱与缺陷阅读笔记(上)
- C陷阱与缺陷笔记