C陷阱与缺陷第二章 语法“陷阱”

来源:互联网 发布:五个金冠的淘宝店铺名 编辑:程序博客网 时间:2024/05/17 02:48

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结合。

原创粉丝点击