《C程序设计语言》笔记 (九) 参考手册1

A.1 引言

A.2 词法规则

程序由存储在文件中的一个或多个翻译单元组成

程序的翻译分几个阶段完成

翻译的第一阶段完成低级的词法转换

执行以字符#开头的行中的指令,并进行宏定义和宏扩展

在预处理完成后,程序被规约成一个记号序列

 

   记号

C语言中共有6类记号:

标识符

关键字

常量

字符串字面量

运算符

其他分隔符

空格 横向制表符和纵向制表符 换行符 换页符 和注释在程序中仅用来分隔记号 因此被忽略

相邻的标识符 关键字和常量之间需要用空白符分隔

如果到某一字符为止的输入留被分隔成若干记号

那么下一个记号就是后续字符序列中可能构成记号的最长字符串

 

   注释

注释以字符/*开始 以 */结束

注释不能够嵌套,也不能出现在字符串字面量或字符字面量中

 

   标识符

标识符是由字母和数字组成

第一个字符必须是字母,下划线也被看成是字母

大写字母和小写字母是不同的

标识符可以为任意长度

对应内部标识符来说,至少前31个字母是有效的

内部标识符包括预处理器的宏名和其他所有没有外部链接的名字

带有外部链接的标识符限制更严格一些,实现可能是认为这些标识符的前6个字符有效,而且可能忽略大小写

  

   关键字

下列标识符被保留作为关键字,不能用于其他用途

auto double int struct

break else long switch

case enum register typedef

char extern return union

conse float short unsigned

continue for signed void

default togo sizeof volatile

do if static while

某些实现还把fortran和asm保留为关键字


关键字const signed  和volatile是ANSI标准新增加的

enum和void是第一版后增加的

entry曾经是保留字,但未被使用,现在已经不是了

  

   常量

常量有多种类型。

每种类型的常量都有一个数据类型

常量:

整型常量

字符常量

浮点常量

枚举常量


1.整型常量

由一串数字组成

如果它以数字0开头,则为8进制,否则为10进制

八进制常量不包含8 和9 

以0x或0X开头的数字为16进制,16进制包含a(A)到f(F) 的字母

整型常量若以u或U为后缀,表示一个无符号数

若以l或L后缀,表示一个长整型

若以UL为后缀,表示一个无符号长整型

2.字符常量

字符常量是用单引号引起来的一个或多个字符构成的序列,如'x'

字符常量的值是执行时机器字符集中此字符对应的数值,多字符常量的值由具体实现定义

字符常量不包括字符'和换行符

可以使用以下转义字符序列表示这些字符以及其他一些字符

换行符 \n

横向制表符 \t

纵向制表符 \v

回退符 \b

回车符 \r

换页符 \f

响铃符 \a

反斜杠 \\

问号  \?

单引号 \'

双引号 \"

八进制数 \000

十六进制数  \xhh

转义序列\000由反斜杠后跟1~3个八进制数值组成 这些八进制用来指定所期望的字符值

\0便是一个常见的例子,表示字符NULL

转义序列\xhh 反斜杠后面紧跟x以及十六进制数值,表示所期望的字符值

数字的个数没有限制,但如果字符值超过最大的字符值,该行为是未定义的

3.浮点常量

由整数 小数点 小数 一个e(E) 一个可以选的带符号整型类型的指数和一个可选的表示类型后缀(F f L l)的组成

整数和小数均由数字序列组成

可以没有整数或小数部分(但不能两者都么有)

还可以没有小数点或者e和指数部分(但不能两者都没有)

浮点常量的类型由后缀确定

F(f)表示float类型

L(l) 表示long double类型 没有后缀表示double类型

  

   字符串字面值

字符串字面量也称为字符串常量

是用双引号引起来的一个字符序列

字符串的类型为"字符数组",存储类为static

它使用给定的字符进行初始化

对相同的字符串字面值是否进行区分取决于具体实现

如果程序试图修改字符串字面值,则行为是未定义的

我们可以把相邻的字符串字面值连接为一个单一的字符串

执行任何连接操作后,都将在字符串的后面增加一个空字符\0

这样扫描字符串的程序便可以找到字符串的结束位置

字符串字面值不包括换行符和双引号字符

但可以用与字符常量相同的转义字符序列表示

 

A.3 语法符号

在手册用到的语法符号中,语法类别用楷体及斜体表示

文字和字符以打字型字体表示

多个候选的类别通常在不同的行中

但在一些情况下,一组字符长度较短的候选项可以放在一行,并以短语 one of标识

可选的终结符或非终结符带有下标  opt

{表达式 opt}

表示一个括在花括号中的表达式是可选的

  

A.4 标识符的含义

标识符也称为名字

可以指代多种实体 

函数

结构标记

联合标记

枚举标记

结构成员或联合成员

枚举常量

类型定义名

标号以及对象等

对象有时也称为变量,它是一个存储位置

对它的解释依赖两个主要属性

存储类和类型

存储类决定了与该标识对象相关联的存储区的生存期

类型决定了对象中值的含义

名字还具有一个作用域和一个连接

作用域即程序中可以访问此名字的区域

连接决定另一作用域中的同一名字是否指向同一个对象

  

存储类

存储类分为两类:

自动存储类

静态存储类

声明对象时使用的一些关键字和声明的上下文共同决定了对象的存储类

自动存储类对象对于一个程序块来说是局部的,在退出程序时对象消失

如果没有使用存储类说明符 或者使用了auto限定符

则程序块中的声明生成的都是自动存储对象

声明为register的对象也是自动存储对象,并且将被存储在机器的快速寄存器中

静态对象可以是某个程序的局部对象,也可以是所以程序块的外部对象

无论是哪一种情况 在退出和再次进入函数或程序块是其值将保持不变

在一个程序块中,静态对象使用关键字static声明

在所有程序块的外部声明且与函数定义在同一级的对象总是静态的

可以通过static关键字将对象声明为某个特定翻译单元的局部对象

这种类型的对象将具有内部链接

当省略显式的存储类或通过关键字external进行声明时,对象度整个程序来说是全局访问的,并且具有外部链接

  

基本类型

派生类型

类型限定符

A.5 对象和左值

A.6 转换

整型提升

整型转换

整数和浮点数

浮点类型

算术类型转换

指针和整数

void

指向void的指针

posted @ 2017-11-11 23:56  大福笔记  阅读(318)  评论(0编辑  收藏  举报