看完《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数组设为缓冲区,改变输出缓存大小。能够把buf声明为静态的或者malloc在堆中,防止main函数结束后buf清空。
#define
assert(e) ((void)((e)||_assert_error(__FILE__,__LINE__)))
typedef
struct foo FOOTYPE
是类型定义语句,定义了一个新的类型。char转换为int时结果没有定义。能够使用unsigned char避免。
(unsigned
char)c
而不是(unsigned)c
,后者将c转换为int再转换为unsigned
int。商
x 除数 + 余数 == 被除数
。大多数实如今负数的除法时。仅仅保证余数与被除数正负号同样,商与被除数的符号无关。应尽量使n为无符号数。
原文:https://www.cnblogs.com/mqxnongmin/p/10666564.html