存档

文章标签 ‘语言规范’

c reference manual读书笔记(五)

2012年3月4日 没有评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: c reference manual读书笔记(五)

这次主要是介绍一些c语言中的类型转换。

1 在c语言里面,除了位域之外所有的数据对象都是表示为一堆抽象的存储单元,每一个存储单元都是由很多位组成的,每位的值不是1就是0,并且每一个存储单元都必须有唯一的地址,并且他们的每一个的大小都是和char的大小一致。每个存储单元有多少位,c语言并没有要求,可是每个存储单元必须能够存储基本字符集的每一个字符。 在标准c中也称存储单元为byte。

2 c程序员一般来说不需要在意一些机器的对齐限制,因为编译器会做对齐操作,但是,c也给了程序员忽略对齐限制的能力,比如cast一个指针到另外的类型。不过这里要注意,假设你要将一个类型为S的指针转换成类型T的指针,此时如果S的对齐因子如果不小于T的对齐因子,那么这个转换就是安全的(也就是说此时你取T的值,是没问题的). 可是如果S的对齐因子如果小于T的对齐因子,此时会出现两种情况,第一种就是当使用转换后的指针时,直接出错。第二种就是硬件或者编译器来帮你找到一个合适的指针来使用这个地址。

3 c99中定义了指针类型uintptr_t和intptr_t这两个值并不是指针的大小,而是指针类型不会超过这两个值, 这里要注意,很多实现中函数指针和数据指针大小是不一样的。而NULL只是数据空指针。对象的值和对象类型的值是不一样的,因为会有一些padding,而这些padding是没有定义的,
阅读全文…

Share

c reference manual读书笔记(四)

2011年9月18日 没有评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: c reference manual读书笔记(四)

主要是介绍c语言中的类型

1 c语言里面分为数值类型(Arithmetic,包括整数,浮点.enum 等),指针类型,数组类型,结构类型,联合类型,函数类型以及void类型。c99中添加了_Bool _Complex _Imaginary三种新的类型。

2 标准c只定义了整数类型的最小精度。char至少8位,short/int至少16位,long至少32位。 long long至少64位。所有的范围都保存在limits.h中。

3 一个有符号的整数所能表示的范围,不仅依赖于位数,还依赖于2进制编码,比如现在的计算机一般都是使用2进制补码的表示(two’s complement)。这里要注意整数类型默认都是signed.

4 一个有符号的整数和无符号的混合的表达式(四则运算,比较等),都会先将有符号的整数转为无符号整数再进行。而所有的无符号的算术运算,最后都会把结果对2的n次方取摸。
阅读全文…

Share

c reference manual读书笔记(三)

2011年7月30日 没有评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: c reference manual读书笔记(三)

这次主要是针对c语言中的声明(declaration)定义.

1 在c语言中声明的作用域(scope)可以分为4种,分别是 block/local scope, prototype scope, function scope以及file scope.其中file scope是最顶层的域. 如果一个声明不是external的,则默认这个声明就是被限制在它所出现的文件中.

2 一个标示符在它被完全声明之前是不能使用的。更精确的说就是从我们定义一个声明到这个声明的结束之间不能出现这个标示符.可是下面的例子是完全正确的,这是因为使用intsize(sizeof)之前,它已经被声明了:

static int intsize = sizeof(intsize)

而下面的例子则会编译出错,因为Test在使用之前还没有被声明.

typedef struct {Test *s} Test;

3 c语言中也支持forward reference,不过只允许下面三种类型,分别是 在goto语句中的label,label都是在goto语句之后声明的;还有就是允许在struct,union,array类型的完全声明之前使用当前的声明,比如下面的例子

typedef struct s {struct s *n} T;

最后一种例外是函数的声明,这个原因是在c99之前,c语言允许隐式(implicitly)的声明,也就是如果一个函数在调用之前没有被声明,则在函数被调用的地方会隐式的声明这个函数(后面会详细介绍这个)。不过c99是不允许隐式的声明的.
阅读全文…

Share

c reference manual读书笔记(二)

2011年7月16日 没有评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: c reference manual读书笔记(二)

这次主要是预处理器和宏处理的部分。

1 预处理器主要是处理源代码中以#开头的行,预处理器执行完毕后的代码必定是一个合法的c程序.

2 预处理器的命令是完全不依赖于c语言的语法的.

3 预处理器不会parse源代码,预处理的词法处理和编译器的是不同的,预处理器能够理解合法的c标记,可是它也会忽略在c编译器中认为是不合法标记。比如下面的代码,对于预处理器来说,没有任何问题的.

int3 i;

4 standard c允许#后面有空格,但是一些老的c编译器是不允许的。如果#后面没有任何字符(除了空格),那么standard c则认为这是一个空行,一些老的编译器有可能有不同的行为.
阅读全文…

Share

c reference manual读书笔记(一)

2011年7月3日 没有评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: c reference manual读书笔记(一)

我读的是第五版的影印版,简单的做了一些笔记.下面是第二章的笔记.

1 c 源文件的字符集(character set)包含在ISO/IEC 10646的Latin block中. 包括5种类型,分别是 52个lating大小写字母,10个数字(0-9),空格,horizontal tab(ht) vertical tab(VT) form feed(FF) 以及29个graphic 字符(这个可以去看c99的手册).而不在集合内的字符可能会出现在注释/字符常量/字符串常量/文件名中.在c中还有执行字符集(execution character)的概念,一般来说编译和运行都在相同的电脑,则source字符集和执行字符集都是相同的.

2 在c的源程序中,blank, end-of-line, vertical tab, form feed, horizontal-tab都会被认为是空格(whitespace characters).

3 c89中要求逻辑行的最大长度是509个字符,而c99是4095个字符.

4 c语言中可以使用 9个trigraphs(比如??/表示\),而trigraphs的翻译会在词法分析之前(gcc默认编译没有打开trigraph,必须添加-trigraphs命令,或者使用-std命令指定c标准).

5 多字节字符(multibytes characters),主要针对非英语的环境.编码实现分为state-independent和state-depend,顾名思义,一个是编码依赖于前一个多字节字符,一个是不依赖于前一个多字节字符.
阅读全文…

Share