《C陷阱与缺陷》 ----读书笔记

1.词法陷阱:

       1): C语言中 ‘=’ 被作为一种操作符对待,为了防止 ‘==’ 被写成 ‘=’,判断相等的时候采用( (x=y) != 0 ) ;

       编译器将程序分解成符号的方法是:从左往右一个一个字符地读入,如果该字符可能组成一个符号,那么读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。

       2): 除了字符与字符串常量,符号的中间不能嵌有空白(空格符、制表符、换行符)。例如:

a---b 与表达式 a-- -b 含义相同。而与 a- --b 的含义不同

        3):用VS17下面的代码会提示:“初始化”: 从“int”到“char”截断 警告信息。打印出来的值为最后一个字符 ‘s’ 对应的ASCII码值。

char var = 'yes';    //  var的结果为‘s’对应ASCII码值

GCC v2.95采取得做法是:依次用后一个字符覆盖前一个字符,最后得到的整数值即最后一个字符的整数值

        4):整型常量的第一个字符是 0,那么该常量将被视作八进制数。 16进制数常量为0x开头。

        5):用双引号引起的字符串,代表的是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制为零的字符 ‘\0’初始化。例如:下面两个是等效的

printf("Hello,world\n");

char arr[] = {'H', 'e', 'l', 'l', 'o', ',', 'w', 'o', 'r', 'l', 'd', '\n', 0}
printf(arr);

    

        6):在VS17中,a+++++b; 会提示一个 无法修改的左值。

                                                                                                                                                                             


2. 语法陷阱:

                 

      1):上面的语句用于显式调用首地址为 0 的子例程

          1.先计算 ( void(*)() ) 是一个强制类型转换,黑体表示指向返回值为 void 类型的 函数指针。

          2. ( * 0)() , 运算符 * 必须要一个指针来做操作数,而且这个指针必须是一个函数指针,所以在上式中对 0 做强制类型转换

使用typedef重新进行声明:

typedef void(*fun)();   // 声明 fun 表示指向一个返回值为 void 类型的函数指针

(*(fun)0)();   // 将 0 强转,然后进行函数调用 

       2):C变量声明由两部分组成:类型以及一组类似表达式的声明符(delcarator)

float f, g;        // 当对其求值时,表达式 f 和 g 的类型为浮点类型

float fun();      // 当对其求值时,表达式 fun() 的结果是一个浮点数,也就是说 fun 是一个返回值为浮点类型的函数

float *p;          // 这个声明的含义是 *p 是一个浮点类数,也就是说 p 是一个指向浮点数的指针

flaot *g()(*h)();    // 表示 *g() 和 (*h)() 是浮点表达式。因为 () 优先级高于 *, *g() 也就是 *(g()):g是一个函数,该函数的返回值类型为指向浮点数的指针。同理,h 是一个函数指针,该指针指向的函数的返回值是 float 类型

       一旦知道了如何声明一个给定类型的变量,那么该类型的类型转换符为:将声明中的变量去掉和声明末尾的分号去掉,再将剩余部分用括号进行封装即可。

float (*h)();  表示 h 是一个返回类型为 float 的函数指针。

float (*)()); 表示一个“指向返回值为浮点类型的指针”的类型转换符

假定变量 fp 是一个函数指针,那么如何调用 fp 所指向的函数?

(*fp)();           // 因为 fp 是一个函数指针,那么 *fp 就是该指针所指向的函数,所以 (*fp)() 就是调用该函数的方式。ANSI C标准允许简写成 fp()。 但是记住这种写法只是一种简写方式。

                                                                                                                                                                                       &2019-3-11

猜你喜欢

转载自blog.csdn.net/Q_feifeiyu/article/details/88395566