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也不能用。
宏定义的时候, 从左开始, 第一个空格之前的是宏, 之后是表达式, 可以有括号, 也可以没有。宏调用的时候有括号不会造成问题。
也可定义如下:
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也不能用。
宏定义的时候, 从左开始, 第一个空格之前的是宏, 之后是表达式, 可以有括号, 也可以没有。宏调用的时候有括号不会造成问题。
相关文章推荐
- c陷阱与缺陷
- C语言缺陷与陷阱(笔记)
- C语言:陷阱和缺陷
- 《C缺陷与陷阱》备忘录
- C的陷阱和缺陷研读笔记02
- C语言陷阱与缺陷(5)
- C陷阱与缺陷
- C陷阱与缺陷-- 读书笔记一
- 《C缺陷与陷阱》阅读笔记-词法陷阱
- C语言陷阱与缺陷 第一章学习
- C陷阱与缺陷--笔记
- C陷阱与缺陷(三)--语义陷阱1
- C陷阱与缺陷(一)----------------------词法“陷阱”
- 程序员必知的 Python 陷阱与缺陷列表
- 读书笔记--C陷阱与缺陷(五)
- C陷阱与缺陷(三)语义"陷阱"
- c缺陷与陷阱笔记-第一章 词法陷阱
- C陷阱与缺陷代码分析之第1章词法陷阱
- <C陷阱与缺陷>中的printf
- C陷阱与缺陷阅读笔记(上)