background image

if,if…else 语句等将由编译器生成选择代码。

循环代码

while(),do…while()语句等将由编译器生成循环代码。

对于一些较为复杂的数学运算如除法(\),取余(%)等,虽然它们是 C 语言的基

本运算,但在各种编译系统中的处理方式却不一定相同。根据编译器和体系结构的特点,
对它们的处理方式有可能与加减等运算相同,即直接生成处理器的机器代码,也有可能
转换成一个库函数的调用。例如,在没有除法指令的体系结构中,编译器在编译 a/b 这类
除法运算的时候,由于处理器没有与其对应的指令,因此会使用调用库函数来模拟除法
运算。浮点数的处理与之类似:对于支持浮点运算的体系结构,将直接生成浮点代码;对
于不支持浮点数的处理器,编译器将会把每一个浮点运算用库函数调用的方式模拟。

2.只读数据段(RO Data

只读数据段由程序中所使用的数据产生,该部分数据的特点是在运行中不需要改变,

因此编译器会将该数据放入只读的部分中。C 语言的一些语法将生成只读数据段。

只读全局量

例如:定义全局变量 const char a[100]={"ABCDEFG"}将生成大小为 100 个字

节的只读数据区,并使用字串"ABCDEFG"初始化。如果定义为 const char 
a[]={"ABCDEFG"},没有指定大小,将根据"ABCDEFG"字串的长度,生成 8 个字节的
只读数据段。

只读局部量

例如:在函数内部定义的变量 const char b[100] ={"9876543210"};其初始化的

过程和全局量一样。

程序中使用的常量

例如:在程序中使用 printf("information \n"),其中包含了字串常量,编译器会自

动把常量"information \n"放入只读数据区。

在 const char a[100]={"ABCDEFG"}中,定义了 100 个字节的数据区,但是只

初始化了前面的 8 个字节(7 个字符和表示结束的'\0')。在这种用法中,实际后面的字
节没有初始化,但是在程序中也不能写,实际上没有任何用处。因此,在只读数据段中,
一般都需要做完全的初始化。

3.读写数据段(RW Data

读写数据段表示了在目标文件中一部分可以读也可以写的数据区,在某些场合它们

又被称为已初始化数据段。这部分数据段和代码段,与只读数据段一样都属于程序中的静
态区域,但是具有可写的特点。

已初始化全局静态变量

例如:在函数外部,定义全局的变量 char a[100]={"ABCDEFG"}

已初始化局部静态变量