实验二预处理指令一实验目的1)掌握普通宏定义与带参数的宏定义的使用方法;2)熟悉条件编译的使用方法。二程序示例[源程序2-1]宏定义与使用注意1#include<stdio.h>27#defineFIRST_PART53#defineLAST_PART4#defineALL_PARTSFIRST_PART + LAST_PART5int main()6 7printf("The square of all the parts is %d)n", ALL_PARTS * ALL_PARTS);8return 0;91[程序输出]The square of all the parts is 47[程序分析]宏定义属于预编译指令的一种,其关键字为#define,本例展示的为宏定义使用时需要注意运算的先后顺序。源程序第2-4行均为宏定义,其关键字为#define,该部分的主要作用是将FIRSTPART、LASTPART和ALLPARTS定义成一种符号,即此时的FIRSTPART是7的别名,LASTPART是5的别名,而ALL_PARTS是FIRST_PART+LASTPART的别名,在编译期间用7取代程序中所有FIRST_PART的值,5取代程序中所有LAST_PART的值,FIRST_PART+LAST_PART取代程序中所有ALL_PARTS的值第5-9行为主程序,其中第6行和第9行是定界符,第7行通过调用printf函数实现输出,其中ALLPARTS*ALLPARTS会被宏替换为7+5*7+5,根据C语言算数运算符的运算规则,宏替换后的表达式值为47。第8行的return语句返回整型值0,表示主程序运行正常
实验二 预处理指令 一 实验目的 1) 掌握普通宏定义与带参数的宏定义的使用方法; 2) 熟悉条件编译的使用方法。 二 程序示例 [源程序 2-1] 宏定义与使用注意 1 #include <stdio.h> 2 #define FIRST_PART 7 3 #define LAST_PART 5 4 #define ALL_PARTS FIRST_PART + LAST_PART 5 int main() 6 { 7 printf("The square of all the parts is %d\n", ALL_PARTS * ALL_PARTS); 8 return 0; 9 } [程序输出] The square of all the parts is 47 [程序分析] 宏定义属于预编译指令的一种,其关键字为#define,本例展示的为宏定义使 用时需要注意运算的先后顺序。 源程序第 2-4 行均为宏定义,其关键字为#define,该部分的主要作用是将 FIRST_PART、LAST_PART 和 ALL_PARTS 定义成一种符号,即此时的 FIRST_PART 是 7 的别名,LAST_PART 是 5 的别名,而 ALL_PARTS 是 FIRST_PART + LAST_PART 的别 名,在编译期间用 7 取代程序中所有 FIRST_PART 的值,5 取代程序中所有 LAST_PART 的值,FIRST_PART + LAST_PART 取代程序中所有 ALL_PARTS 的值. 第 5-9 行为主程序,其中第 6 行和第 9 行是定界符,第 7 行通过调用 printf 函数实现输出,其中 ALL_PARTS*ALL_PARTS 会被宏替换为 7+5*7+5,根据 C 语言 算数运算符的运算规则,宏替换后的表达式值为 47。第 8 行的 return 语句返回 整型值 0,表示主程序运行正常
[源程序2-2]带参数的宏1#include<stdio.h>2#define MAX(a,b) (a>b)?a:b3void main()415int x, y,max;6printf("lnputtwonumbers(separatedwithspace):");7scanf("%d%d",&x,&y);8max=MAx(x,y); // max=(x>y)?x:y;9printf("The max is %d)n", max);101[程序输出]Inputtwonumbers(separatedwithspace):12215Themaxis15[程序分析]源程序2-2给出了带参数宏定义的使用。第2行为带参数的宏定义MAX,其中参数为a和b,在编译期间用(a>b)?a:b取代程序中所有MAX(a,b)的值。第3-10行为主程序,其中第4、10行为定界符,第5行定义三个整型值变量x、y和max,第6行通过函数语句printf输出语句"Inputtwonumbers(separatedwithspace):”,提示用户输入两个数字并以空格分隔,第7行通过scanf实现对用户数据的输入,并以“%d%d”(即空格分隔的两个十进制整形数据的形式)进行扫描后按先后顺序放置于变量x和y的地址中(&x表示变量x在内存中的地址,&y表示变量y在内存中的地址),第8行为使用带参数宏定义的语句,该行注释语句为进行宏替换后的实际进行编译的语句,可以看出进行宏替换后,实际进行宏调换的参数是x和y,第9行语句调用系统printf函数输出最终结果。[源程序2-3]条件编译1#include<stdio.h>2#defineBB3#ifdefAA4#define HELLO"hello world"5#else
[源程序 2-2] 带参数的宏 1 #include <stdio.h> 2 #define MAX(a,b) (a>b)?a:b 3 void main() 4 { 5 int x, y, max; 6 printf("Input two numbers(separated with space): "); 7 scanf("%d %d", &x, &y); 8 max = MAX(x, y); // max = (x>y) ? x : y; 9 printf("The max is %d\n", max); 10 } [程序输出] Input two numbers(separated with space): 12 15 The max is 15 [程序分析] 源程序 2-2 给出了带参数宏定义的使用。 第 2 行为带参数的宏定义 MAX,其中参数为 a 和 b,在编译期间用(a>b)?a:b 取代程序中所有 MAX(a,b)的值。 第 3-10 行为主程序,其中第 4、10 行为定界符,第 5 行定义三个整型值变 量 x、y 和 max,第 6 行通过函数语句 printf 输出语句“Input two numbers(separated with space):”,提示用户输入两个数字并以空格分隔,第 7 行通过 scanf 实现对用 户数据的输入,并以“%d %d”(即空格分隔的两个十进制整形数据的形式)进 行扫描后按先后顺序放置于变量 x 和 y 的地址中(&x 表示变量 x 在内存中的地 址,&y 表示变量 y 在内存中的地址),第 8 行为使用带参数宏定义的语句,该行 注释语句为进行宏替换后的实际进行编译的语句,可以看出进行宏替换后,实际 进行宏调换的参数是 x 和 y,第 9 行语句调用系统 printf 函数输出最终结果。 [源程序 2-3] 条件编译 1 #include<stdio.h> 2 #define BB 3 #ifdef AA 4 #define HELLO "hello world" 5 #else
6#define HELLO"hello CC"1#endif89int main()10 (11print("%s)n",HELLO);12return O;131[程序输出]helloCC[程序分析]一般情况下,C语言源程序中的每一行代码均需参加编译,但有时出于对程序代码优化或不同平台使用不同语句等考虑,希望只对其中一部分内容进行编译,此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,即条件编译(conditionalcompile)。源程序2-3演示如何使用条件编译实现同一宏名不同值功能,第1-9行为预编译指令语句,其中第1行为系统库stdio.h包含语句,第2行定义宏BB,第3-7行为条件编译语句,其中#ifdef、#else和#endif分别表示如果定义、其他情况和结束条件编译的含义,即如果定义AA,则编译第4行语句#defineHELLO"helloworld",定义宏HELLO的值为"helloworld",否则编译第6行语句#defineHELLO"helloCC",定义宏HELLO的值为"helloCC",由于在程序中并未定义AA,因此第6行语句#defineHELLO"helloCC"参加编译,定义宏HELLO的值为"helloCC"。第9-13行为主程序,其中第11行调用printf实现对宏HELLO内容的输出。三、程序编写1、定义一个带参数的宏,使得两个参数的值互换,并在主函数main中输入两个整数作为此宏的参数,输出交换前后的两个值。s=a+b+c2、已知三角形的面积area=/s(s-a)(s-b)s-c),其中2,a,b,c为三角形的三条边。要求:定义两个带参数的宏,分别用来计算s和area。编写程序,用带参数的宏来计算三角形的面积(运算结果保留2位小数)
6 #define HELLO "hello CC" 7 #endif 8 9 int main() 10 { 11 printf("%s\n",HELLO); 12 return 0; 13 } [程序输出] hello CC [程序分析] 一般情况下,C 语言源程序中的每一行代码均需参加编译,但有时出于对程 序代码优化或不同平台使用不同语句等考虑,希望只对其中一部分内容进行编译, 此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译,将不满 足条件的代码舍弃,即条件编译(conditional compile)。源程序 2-3 演示如何使 用条件编译实现同一宏名不同值功能。 第 1-9 行为预编译指令语句,其中第 1 行为系统库 stdio.h 包含语句,第 2 行定义宏 BB,第 3-7 行为条件编译语句,其中#ifdef 、#else 和#endif 分别表示 如果定义、其他情况和结束条件编译的含义,即如果定义 AA,则编译第 4 行语 句#define HELLO "hello world",定义宏 HELLO 的值为"hello world",否则编译 第 6 行语句#define HELLO "hello CC",定义宏 HELLO 的值为"hello CC",由于在程 序中并未定义 AA,因此第 6 行语句#define HELLO "hello CC"参加编译,定义宏 HELLO 的值为"hello CC"。 第 9-13 行为主程序,其中第 11 行调用 printf 实现对宏 HELLO 内容的输出。 三、程序编写 1、 定义一个带参数的宏,使得两个参数的值互换,并在主函数 main 中输入两 个整数作为此宏的参数,输出交换前后的两个值。 2、 已知三角形的面积area = s(s − a)(s − b)(s − c) ,其中 2 a b c s + + = ,a,b,c为三 角形的三条边。要求:定义两个带参数的宏,分别用来计算 s 和area 。编写 程序,用带参数的宏来计算三角形的面积(运算结果保留2位小数)