您的位置:首页 > 其它

c陷阱与缺陷

2012-04-11 18:11 162 查看
void (*signal(int, void(*)(int)))(int): signal是函数指针, 返回值是指向返回类型为void, 参数为int的函数的指针, 该函数有两个参数一个是int形,一个是函数指针, 该指针指向返回类型为void, 参数为int的函数。

也可定义如下:

typedef void (*HANDLER)(int);

HANDLER signal(int HANDLER);





flag & FLAG != 0 相当于flag & (FLAG != 0)



hi << 4 + low相当于hi << (4 + low)



*p++相当于*(p++), 意为取p值再对p++



运算符优先级(从高到低):

1. 括号, ., 数组下标, 取指针,

2. 单目运算符: !, ~, ++, --, -, (type), *, &, sizeof()----sizeof是运算符!, 右结合

3. 双目运算符:

3.1). 算数运算符: *, /, %; 然后+, -.前者高于后者

3.2): 移位运算符:<<, >>

3.3): 关系运算符: <. <=, >, >=; 然后==, !=, 前者高于后者

3.4); 逻辑运算符: &, ^, |; &&, ||

3.5): 条件运算符:? :(三目, 但事实优先级高于=), 右结合

3.6): 赋值运算符: =; 右结合

3.7): 逗号运算符: 用于分隔表达式



任意两个逻辑运算符有不同的优先级

a+++b被解释成(a++)+b, 在gcc中测试的结果为, 不能有a+++++b的形式(可能跟gcc的版本有关, 从测试的结果来看是出现了((a++)++)或者(++(++b))的原因, 如果改成(a++) + (++b)则正确编译),



c语言初始化列表中允许出现多余的逗号



i = 0

while (i<n) {

y[i] = x[i++];

}

这个表达式是有问题的, 因为不能保证i的自增操作在y取址之前。





用lint吧



如果一个 函数在被申明、定义之前引用, 默认返回整形?!这个能编译过?



如果一个函数没有float, short, char类型的参数, 声明的时候可以完全省略形参包括类型说明, 这样做依赖于调用者能给定正确类型的实参, float转换成double, short/char转换成int。如果函数定义的时候形参类型是char, 则可能引起错误。而如果参数类型是int型, 则可以在声明时省略。



库函数setbuf()设置输出缓冲区。如setbuf(stdout, buf);

使用fflush清空缓冲区, 并输出缓冲区内容到stdout, 如果是写文件的话, 缓冲写入文件。缓冲区的大小可用宏BUFSIZ在定义缓冲区的时候指定。注意这个buf应该有全局性, 不然在函数退出的时候会被释放。



信号处理函数中不能用malloc, 也不能用其他带锁的函数,否则可能造成死锁。 longjmp也不能用。



宏定义的时候, 从左开始, 第一个空格之前的是宏, 之后是表达式, 可以有括号, 也可以没有。宏调用的时候有括号不会造成问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: