C陷阱与缺陷
2013-02-02 17:44
260 查看
1.字符与字符串
用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值。因此,对于采用ASCII字符集的编译器而言,'a'的含义与0141(八进制)或者97(十进制)严格一致。
用双引号引起的字符串,代表的却是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制为零的字符'\0'初始化。
下面的这个语句:
printf("Hello world\n");
与
char hello[] = {'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n', 0};
printf(hello);
是等效的。
2.声明
float f, g;
这个声明的含义是:当对其求值时,表达式f和g的类型为浮点数类型(float)。因为声明符与表达式相似,所以我们也可以再声明符中任意使用括号:
float ((f));
这个声明的含义是:当对其求值时,((f))的类型为浮点类型,由此可以退知,f也是浮点类型。
同样的逻辑也适用于函数和指针的类型声明,例如:
float ff();
这个声明的含义是:表达式ff()求值结果是一个浮点数,也就是说,ff是一个返回值为浮点类型的函数。类似地,
float *pf;
这个声明的含义是*pf是一个浮点数,也就是说,pf是一个指向浮点数的指针。
以上这些形式在声明中还可以组合起来,就像在表达式中进行组合一样。因此,
float *g(), (*h)();
表示*g()与(*h)()是浮点表达式。因为()结合优先级高于*,*g()也就是*(g()):g是一个函数,该函数的返回值类型为指向浮点数的指针。同理,可以得出h是一个函数指针,h所指向函数的返回值为浮点类型。
3.运算符
int a,b;
if(a & b) ...
这里的&是按位与运算符,比如8 & 7 == 0, 8 & 9 == 8
用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值。因此,对于采用ASCII字符集的编译器而言,'a'的含义与0141(八进制)或者97(十进制)严格一致。
用双引号引起的字符串,代表的却是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制为零的字符'\0'初始化。
下面的这个语句:
printf("Hello world\n");
与
char hello[] = {'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n', 0};
printf(hello);
是等效的。
2.声明
float f, g;
这个声明的含义是:当对其求值时,表达式f和g的类型为浮点数类型(float)。因为声明符与表达式相似,所以我们也可以再声明符中任意使用括号:
float ((f));
这个声明的含义是:当对其求值时,((f))的类型为浮点类型,由此可以退知,f也是浮点类型。
同样的逻辑也适用于函数和指针的类型声明,例如:
float ff();
这个声明的含义是:表达式ff()求值结果是一个浮点数,也就是说,ff是一个返回值为浮点类型的函数。类似地,
float *pf;
这个声明的含义是*pf是一个浮点数,也就是说,pf是一个指向浮点数的指针。
以上这些形式在声明中还可以组合起来,就像在表达式中进行组合一样。因此,
float *g(), (*h)();
表示*g()与(*h)()是浮点表达式。因为()结合优先级高于*,*g()也就是*(g()):g是一个函数,该函数的返回值类型为指向浮点数的指针。同理,可以得出h是一个函数指针,h所指向函数的返回值为浮点类型。
3.运算符
int a,b;
if(a & b) ...
这里的&是按位与运算符,比如8 & 7 == 0, 8 & 9 == 8
相关文章推荐
- 程序员老司机都要错的 Python 陷阱与缺陷列表
- C陷阱与缺陷(五)库函数
- C陷阱与缺陷(二)
- C陷阱与缺陷-浮点数和0比较
- C陷阱与缺陷二.1
- Objective-C的陷阱与缺陷
- C陷阱和缺陷读书记录
- C陷阱和缺陷
- C陷阱与缺陷(小结1)
- C陷阱与缺陷:第五,六章
- C语言缺陷与陷阱(笔记)
- C陷阱与缺陷学习笔记
- 关于《C陷阱和缺陷》中的(*(void(*)())0)()表达式的一点解析
- c缺陷与陷阱
- 读书笔记--C陷阱与缺陷(七)
- C陷阱与缺陷(六)预处理器
- C Traps and Pitfalls (C语言陷阱和缺陷) 读书总结
- C陷阱与缺陷(一)之词法分析中的“贪心法”
- C陷阱与缺陷的学习笔记
- C陷阱与缺陷学习(第1、2章)