C程序设计语言之附录A 参考手册
1、引言
本手册描述的C语言是1988年10月31日提交给ANSI的草案。
2、词法规则
首先,翻译单元(translation unit)是什么?http://blog.chinaunix.net/uid-27018250-id-4305502.html大概是至少能通过编译生成一个目标文件吧。
2.1 记号
C语言中的6类记号:标识符、关键字、常量、字符串字面值、运算符和其他分隔符。
2.2 注释
果然标准的注释还是/**/。
2.3 标识符
再次提到了有外部链接的标识符的起名限制:
2.4 关键字
2.5 常量
书上原话:“字符常量不包括字符’和换行符。”md这个问题好像网上有好多案例,都是遇到了“常量中有换行符”的问题。有查到“单撇号只是界限符,不属于字符常量中旳一部分”这样的说法,那换行符呢?
2.6 字符串子面值
字符串的类型为“字符数组”,存储类为static。
3、语法符号
上面是对后面内容的书写格式的介绍,说实话,没大看懂,主要是后面用到这种格式的描述看不懂。
4、标识符的含义
对它的解释依赖两个属性:存储类和类型。存储类决定了与该标识符对象相关联的存储区域的生存期,类型决定了标志对象中值的含义。
4.1 存储类
automatic & static
4.2 基本类型
文中提到:“以关键字unsigned声明的无符号整数遵守算数模2^n的规则,其中n是相应整数的二进制位数。对无符号数的算术运算永远不会溢出。”
首先,这里的n好像是整数的类型的字节数对应的二进制位数。当无符号数出现负数时,要把这个负数转换成可以表示的正数,做法就是取它对2的n次方的模。这样得到的结果永远都是在对应的无符号整型的取值的范围内,也就“没有溢出”了。
所以要注意,无符号数之间的相减要不要产生负数,而当一个负数与一个无符号数进行运算时,前者会被提升为unsigned,此时的结果就不一定是所希望的了。
4.3 派生类型
数组 函数 指针 结构 联合
4.4 类型限定符
声明为volatile的对象表明它具有与优化相关的特殊属性。
5、 对象和左值
对象是一个命名的存储区域,左值lvalue是引用某个对象的表达式。
6、转换
6.1 整形提升
如果对原始类型的所有值都可用int类型表示,则其值将被转换为int类型;否则将被转换为unsigned int类型。(一种说法:通常情况下,在对int类型的数值作运算时,CPU的运算速度是最快的。在x86上,32位算术运算的速度比16位算术运算的速度快一倍。)后半句话的意思大概是我不想输出int型,比如用了%u?
6.2 整型转换
6.3 整型和浮点数
6.4 浮点类型
6.5 算数类型转换
特意地到了“对float类型操作数的算术运算可以只用单精度而不是双精度”;所以,float+double时,是怎么转换的呢?
6.6 指针和整数
这一节就麻烦了,mark吧。
6.7 void
可以通过强制类型转换将表达式转换为void类型。例如,在表达式语句中,一个空的强制类型转换将丢掉函数调用的返回值。
int a(void)
{
int x = 10;
return (void)x;
}
int