C缺陷与陷阱 笔记

栏杆错误的两个通用原则:
首先考虑最简单情况下的特例,然后将得到的结果往后推
仔细计算边界,绝不掉以轻心


用第一个入界点和第一个出界点来表示一个取值范围


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来检查错误

Iferror

   /处理错误/

这种方法是不对的:

1 如果库函数没有失败,并没有要求error一定为0

但是如果我们这样:

Error = 0

/调用库函数/

If(error)

/处理错误/

也是错误的,因为有可能库函数调用成功,也有可能会设置error,因为库函数可能会调用别的库函数

正确的方法应该是:

/调用库函数/

If(返回的错误值)

检查errno

 

 

库函数 signal

 

预处理器

不能忽视宏定义中的空格?

宏并不是语句中,对于assert是如何定义的?

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

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

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

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值