您的位置:首页 > 其它

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是如何定义的?

宏并不是函数:参数用括号括起来,整个表达式也应该用括号括起来

但是这样也会有危险:如果里面的参数会有两次用到,而且会求值两次,这样就会导致不确定性。

而且会有可能占据大量的空间

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: