第9章预编译和位运算.pptVIP

  • 1
  • 0
  • 约8.63千字
  • 约 48页
  • 2018-02-15 发布于江西
  • 举报
第9章预编译和位运算

第9章 预编译和位运算 * 在学习和编写C语言源程序的时候,我们通常会遇到和用到一些如 #include…,#define…等之类的命令,这些以“#”开头的命令我们称之为预编译命令。预编译命令不是C语言本身组成的部分,所以在使用时以“#”开头,以示和C语言区别。 预编译又称为预处理,是指对C语言源程序进行词法扫描和语法分析之前,首先对预编译命令进行处理,然后再进行编译以得到目标代码。 预编译处理是C语言编译系统的一个重要的功能,它主要包含宏定义、文件包含和条件编译。这三个功能分别用宏定义命令,文件包含命令和条件编译命令来实现。在程序中正确适当地使用预编译处理功能可使程序易读、易改、易移植、易调试,也有利于模块化程序设计,从而可以有效地提高程序的开发效率。下面我们就用一些简单易懂的例子来讲解这三种常用的预编译处理功能。本章的例子和源程序均在Visual C++6.0开发环境下运行。 9.1 宏定义 9.2 文件包含 9.3 条件编译 9.4 位运算 9.1 宏定义 宏定义是指用一个指定的标识符来代表一个字符串,这里的标识符叫做“宏名”。预编译时将宏名替换成字符串的过程叫“宏展开”。宏定义又分为不带参数和带参数两种,下面将分别介绍。 9.1.1不带参数宏定义 不带参数宏定义的一般形式为: #define 标识符 字符串 其中,上述形式的标识符也称为“常量标识符”或“符号常量符”。它的功能是在程序的开头使用,将指定的常量表达式进行符号化的替换,使该符号常量有一定的标识意义。 例如: #define F (y*y-8*y) 表示将表达式(y*y-8*y)在程序中由标识符F代替。在编写源程序时,所有的(y*y-8*y)都可由F代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(y*y-8*y)表达式去置换所有的宏名F,然后再进行编译。 【例9.1】不带参数宏定义举例。 #define F (y*y-8*y) int main( ) { int s,y;  printf(input a number: );  scanf(%d,y);  s=2*F+3*F+4*F;  printf(s=%d\n,s); return 0; } 运行结果如下: input a number:3↙ s=-135 使用不带参数宏定义时我们还应该注意: (1)习惯上宏名用大写字母表示,以便于与变量区别。但也允许用小写字母。 (2) 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起进行置换。 (3) 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。 (4)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如果要终止其作用域可使用# undef命令。 例如: #define AGE 30 int main() { int a; …… return 0; } #undef AGE void max() { …… } 上述程序段表示AGE只在main函数中有效,在函数max中无效。 (5) 宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。 例如: #define AGE 20 #include stdio.h int main() {  printf(AGE); printf(\n); return 0; } 运行结果如下: AGE 上面程序定义宏名AGE表示20,但在printf语句中AGE被引号括起来,因此不作宏代换。此时“AGE”是字符串而不是宏名,不作宏替换 (6)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。 例如: #define M 100 #define N (M+r*r) /*M是已定义的宏名*/ 对语句: printf(%d,N);  在宏代换后变为: printf(%d,100+r*r); 9.1.2带参数宏定义 带参数宏定义的一般形式为: #define 宏名(参数表) 字符串 【例9.2】带参数宏定义举例。 #includestdio.h #define SUB(a,b) a*b int main() { int c; c=SUB(2,3); printf(“%d”,c); return 0; } 运行结果如下: 6 带参数的宏与函数有许多相似之处,但两者有本质区别: (1)函数调用时,先求出实参表达式的值,再把此值传递给形参;二使用带参数的宏时,只是简单的字符替换然后代入形参,而使用带参的宏只是进行简单的字符替换。 例如: #define SQ(x)

文档评论(0)

1亿VIP精品文档

相关文档