看完《C陷阱与缺陷》,忍不住要重新翻一下,记录一下与自己的惯性思维不符合的地方。记录的是知识的增量,是这几天的流量,而不是存量。
这本书是在ASCI C/C89订制之前写的,有些地方有疏漏。
x+++++y
将被解析为x++
++ +y
,并编译出错。/*/**/*/
)只在某些C编译器中允许,如gcc4.8.2编译时是不支持的。int
a[12][31]
表示的是一个长度12的数组,每个元素是一个长度31的数组。p
= &a
的写法是非法的(gcc4.8.2只是警告)。char *r,*malloc()
//原文称不能直接声明一个s、t长度之和的数组,但c99可以声明变长数组,已经可以了
//记得要把长度加1
r = malloc(strlen(s) + strlen(t) +1);
//必须判断内存是否分配成功
if(!r){
complain();
exit(1);
}
strcpy(r,s);
strcat(r,t);
......
//完成之后一定要释放r
free(r);
int i,a[10];
for(i = 1; i<=10; i++)
a[i] = 0;
--n
一般比n--
执行速度更快。y[i]
= x[i++]
结果是未定义的。if(a+b
< 0)
是不正确的,因为溢出时的行为是未定义的。正确的方法是将两者转换为unsigned型与INT_MAX比较if(a
> INT_MAX - b)
int
a
若出现在所有函数体之外,则完成了声明与定义(分配存储空间)。而extern int a;
只是声明,说明a的存储空间是在其他地方分配的,不是定义;因此必须在别的某个地方定义,同一个或不同的源文件均可。setbuf(stdout,
buf);
可以强制将buf指向的char数组设为缓冲区,改变输出缓存大小。#define
assert(e) ((void)((e)||_assert_error(__FILE__,__LINE__)))
typedef
struct foo FOOTYPE
是类型定义语句,定义了一个新的类型。(unsigned
char)c
而不是(unsigned)c
,后者将c转换为int再转换为unsigned
int。商
x 除数 + 余数 == 被除数
,大多数实现在负数的除法时,只保证余数与被除数正负号相同,商与被除数的符号无关。应尽量使n为无符号数。
阅读《C陷阱与缺陷》的知识增量,布布扣,bubuko.com
原文地址:http://blog.csdn.net/caozhk/article/details/35925939