C陷阱与缺陷第二章 语法“陷阱”
2017-07-19 21:46
190 查看
1.理解函数声明
①float *g(); //g是一个函数,该函数的返回值类型为指向浮点数的指针;
②float (*h)(); //h是一个函数指针,h所指向函数的返回值为浮点类型;
③声明一个给定类型的变量,要得到该类型的类型转换符:把声明中的变量名和声明末尾的分号去掉,再将剩余的部分用一个括号整个“封装”起来。因此 (float (*)()) 表示一个“指向返回值为浮点类型的函数指针 float (*h)()”的类型转换符。
④将常数0转型为“指向返回值为void的函数的指针”类型:(void (*)())0;
如果fp是一个指向返回值为void类型的函数的指针,(*fp)();
可以用(void ()())0 替换fp,得到:(*void()()0)();
2.运算符的优先级问题
①优先级最高者包括数组下标、函数调用操作符,具体有 ()、[]、->、. ;
②单目运算符(运算所需变量为一个)优先级为第二,是自右向左结合;具体有: !、~、++、-、(type)、*、&、sizeof;
③接下来是双目运算符(运算所需变量为两个),其中,算术运算符的优先级最高(*、/、%、+、-),移位运算符次之(<<、 >>),接着是关系运算符(< 、<= 、> 、>= 、== 、!=),最后是逻辑运算符(&、^、|、&&、||);
④三目条件运算符优先级再低(? :);
⑤赋值运算符的优先级再低,逗号运算符最低。
3.switch语句
C语言中把case标号当作真正意义上的标号,因此如果不加break,程序的控制流程会直径通过case标号,执行下一个case后的语句,不受任何影响。
4.“悬挂”else引发的问题
在C语言里,else始终与同一对话括号内最近的未匹配的if结合。
①float *g(); //g是一个函数,该函数的返回值类型为指向浮点数的指针;
②float (*h)(); //h是一个函数指针,h所指向函数的返回值为浮点类型;
③声明一个给定类型的变量,要得到该类型的类型转换符:把声明中的变量名和声明末尾的分号去掉,再将剩余的部分用一个括号整个“封装”起来。因此 (float (*)()) 表示一个“指向返回值为浮点类型的函数指针 float (*h)()”的类型转换符。
④将常数0转型为“指向返回值为void的函数的指针”类型:(void (*)())0;
如果fp是一个指向返回值为void类型的函数的指针,(*fp)();
可以用(void ()())0 替换fp,得到:(*void()()0)();
2.运算符的优先级问题
①优先级最高者包括数组下标、函数调用操作符,具体有 ()、[]、->、. ;
②单目运算符(运算所需变量为一个)优先级为第二,是自右向左结合;具体有: !、~、++、-、(type)、*、&、sizeof;
③接下来是双目运算符(运算所需变量为两个),其中,算术运算符的优先级最高(*、/、%、+、-),移位运算符次之(<<、 >>),接着是关系运算符(< 、<= 、> 、>= 、== 、!=),最后是逻辑运算符(&、^、|、&&、||);
④三目条件运算符优先级再低(? :);
⑤赋值运算符的优先级再低,逗号运算符最低。
3.switch语句
C语言中把case标号当作真正意义上的标号,因此如果不加break,程序的控制流程会直径通过case标号,执行下一个case后的语句,不受任何影响。
4.“悬挂”else引发的问题
在C语言里,else始终与同一对话括号内最近的未匹配的if结合。
相关文章推荐
- c缺陷与陷阱笔记-第二章 语法陷阱
- C陷阱与缺陷(二)语法"陷阱"
- 【C陷阱和缺陷】词法缺陷和语法缺陷
- C陷阱与缺陷代码分析之第2章语法陷阱
- C陷阱与缺陷 —— 读书笔记-2、语法“陷阱”
- 第二章语法陷阱
- 《再读》第二章 语法“陷阱”
- C陷阱与缺陷 第二章
- C陷阱与缺陷之语法陷阱
- C陷阱与缺陷之语法陷阱
- 《c陷阱与缺陷》第二章,语法陷阱
- C陷阱与缺陷代码分析之第2章语法陷阱
- 第二章 语法“陷阱”
- 《C陷阱与缺陷》学习笔记总结:词法陷阱、语法陷阱、语义陷阱,连接、库函数、预处理器、可移植性缺陷及其他
- 第二章 语法陷阱
- 《C陷阱与缺陷》 第二章 语法“陷阱”
- c陷阱与缺陷 语法陷阱有感
- C语言陷阱和缺陷
- C语言缺陷与陷阱(一)
- 《C陷阱与缺陷》读书笔记--第一章语法陷阱1