**第一章:词法‘陷阱’**
1.1
=为赋值操作,==是比较,容易将=与==弄混而出现错误。
1.2
&和|为位运算符,&&和||为逻辑运算符。
1.3
贪心法:如果(编译器的)输入流截止至某个字符之前都已经被分解为一个个符号,那么下一个符号将包括从该字符之后可能组成一个符号的最长字符串。
y=x/*p 实际等于 y=x 因为/*将后面当成了注释。
应该写成y=x/(*p)
**第二章:语法‘陷阱’**
2.1
(*(void(*)())0)() 的意思是调用(void(*)())0所指向的函数,而后者的意义是将常数0转型为“指向返回值为void函数的指针”。
signal函数:void(*signal(int,void(*)(int)))(int);
2.2
C语言运算符优先级表格。
**第三章:语义‘陷阱’**
3.1
int calendar[12][31]:
calendar是一个数组,该数组拥有12个数组类型的元素,其中每个元素都是一个拥有31个int类型元素的数组。
calendar[n]表示calendar中第n+1个拥有31个int类型元素的数组首个元素的地址。
3.2
将字符串s、t连接成单个字符串r:
char *r,*mallic();
r=malloc(strlen(s)+strlen(t)+1); //+1为加字符‘\0’
if(!r){ //判断*r所指空间是否为空
complain();
exit(1);
}
strcpy(r,s);
strcat(r,t);
free(r); &nb
1.1
=为赋值操作,==是比较,容易将=与==弄混而出现错误。
1.2
&和|为位运算符,&&和||为逻辑运算符。
1.3
贪心法:如果(编译器的)输入流截止至某个字符之前都已经被分解为一个个符号,那么下一个符号将包括从该字符之后可能组成一个符号的最长字符串。
y=x/*p 实际等于 y=x 因为/*将后面当成了注释。
应该写成y=x/(*p)
**第二章:语法‘陷阱’**
2.1
(*(void(*)())0)() 的意思是调用(void(*)())0所指向的函数,而后者的意义是将常数0转型为“指向返回值为void函数的指针”。
signal函数:void(*signal(int,void(*)(int)))(int);
2.2
C语言运算符优先级表格。
**第三章:语义‘陷阱’**
3.1
int calendar[12][31]:
calendar是一个数组,该数组拥有12个数组类型的元素,其中每个元素都是一个拥有31个int类型元素的数组。
calendar[n]表示calendar中第n+1个拥有31个int类型元素的数组首个元素的地址。
3.2
将字符串s、t连接成单个字符串r:
char *r,*mallic();
r=malloc(strlen(s)+strlen(t)+1); //+1为加字符‘\0’
if(!r){ //判断*r所指空间是否为空
complain();
exit(1);
}
strcpy(r,s);
strcat(r,t);
free(r); &nb