第9章 宏定义1
DSP原理及应用课后答案电子工业
第二章3、处理器工作方式状态寄存器PMST 中的MP/MC、OVLY 和DROM 三个状态位对C54x的存储空间结构各有何影响?当OVLY= 0 时,程序存储空间不使用内部RAM。
当OVLY= 1 时,程序存储空间使用内部RAM。
内部RAM 同时被映射到程序存储空间和数据存储空间。
当MP/ MC=0 时,4000H~EFFFH 程序存储空间定义为外部存储器;F000H~FEFFH 程序存储空间定义为内部ROM;当MP/ MC=1 时,4000H~FFFFH 程序存储空间定义为外部存储。
DROM=0:0000H~3FFFH—— 内部RAM ;4000H~FFFFH—— 外部存储器;DROM=1 :0000H~3FFFH——内部RAM;4000H~EFFFH——外部存储器;F000H~FEFFH——片内ROM;FF00H~FFFFH——保留。
4 、TMS320C54x 芯片的片内外设主要包括哪些电路?①通用I/O 引脚②定时器③时钟发生器④主机接口HPI⑤串行通信接口⑥软件可编程等待状态发生器⑦可编程分区转换逻辑5、TMS320C54x 芯片的流水线操作共有多少个操作阶段?每个阶段执行什么任务?完成一条指令都需要哪些操作周期?六个操作阶段:①预取指P;将PC 中的内容加载PAB ②取指F; 将读取到的指令字加载PB③译码D; 若需要,数据1 读地址加载DAB;若需要,数据2 读地址加载CAB;修正辅助寄存器和堆栈指针④寻址A; 数据1 加载DB;数据2 加载CB;若需要,数据3 写地址加载EAB⑤读数R; 数据 1 加载DB;数据 2 加载CB;若需要,数据 3 写地址加载EAB;⑥执行X。
执行指令,写数据加载EB。
6、TMS320C54x 芯片的流水线冲突是怎样产生的?有哪些方法可以避免流水线冲突?答:’C54x 的流水线结构,允许多条指令同时利用CPU 的内部资源。
由于CPU 的资源有限,当多于一个流水线上的指令同时访问同一资源时,可能产生时序冲突。
大学C语言笔记
第一章概述1.C语言的特点①语言简洁、紧凑,使用方便、灵活。
共有32个关键字,9种控制语句。
②运算符丰富,公有34种运算符。
③数据结构丰富,数据类型有:整型、实型、字符型、数组、指针、结构体、共用体等。
④具有结构化的控制语句(如if…else、while、do…while、switch、for)⑤语法限制不太严格,程序设计自由度大。
⑥允许直接访问物理地址,能进行位(bit)操作,可以直接对硬件操作。
⑦生成目标代码质量高,程序执行效率高。
⑧可移植性好。
2.C语言的用途C虽不擅长科学计算和管理领域,但对操作系统和系统实用程序以及对硬件进行操作方面,C有明显的优势。
现在很多大型应用软件也用C编写。
Top of Page第二章数据类型、运算符与表达式1.C的数据类型C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。
2.常量与变量常量其值不可改变,符号常量名通常用大写。
变量其值可以改变,变量名只能由字母、数字和下划线组成,且第一个字符必须为字母或下划线。
否则为不合法的变量名。
变量在编译时为其分配相应存储单元。
3.整型数据整型常量的表示方法:十进制不用说了,八进制以0开头,如0123,十六进制以0x开头,如0x1e。
整型变量分为:基本型(int)、短整型(short int)、长整型(long int)和无符号型。
不同机器上各类数据所占内存字节数不同,一般int型为2个字节,long型为4个字节。
4.实型数据实型常量表示形式:十进制形式由数字和小数点组成(必须有小数点),如:0.12、.123、1230.0等。
指数形式如123e3代表123×10的三次方。
实型变量分为单精度(float)和双精度(double)两类。
在一般系统中float型占4字节,7位有效数字,double型占8字节,15~16位有效数字。
5.字符型数据字符变量用单引号括起来,如'a','b'等。
C语言 第九章 预处理命令
目的: 简化程序的编写 ; 提高程序的模块化、可读性、可移植性。
有三种类型的预处理命令: 1. 宏定义命令; 2. 文件包含命令; 3. 条件编译命令。
为了与C语句区别,这些命令均以“ # ”开头。
处理流程: 第一次编译扫描时,将预编译命令处理完, 然后再进行正式编译,生成目标代码。
#define f(a)
(a)* b
若有:f(x+y) 则应有:
(x+y)b
若有:f(x+y+z) 则应有:
预编译后, z = f(x+y) 变成: z = x+y*b 结果为: z=31
(x+y+z)b
(这个结果与初始设想不一致)
“带参数宏定义” 必须注意以下几个方面: 1. 宏定义时要考虑实参(替换)的各种可能, 防止出 现二义性。
3. #include后的文件名既可用“ ”,也可用< >, 二者区别:
“ ”首先在当前目录中找,然后再去标准目录中找。
< > 只在标准目录(include目录)中找。
为提高预处理的搜索效率,通常对自定义的 非标准头文件使用方式一;而对系统提供的标准 头文件(如:math.h、stdio.h等)使用方式二。
将返回值 6 将返回值 8
但二者还是有区别的:
1) 宏替换在预编译时进行;
而函数调用在程序运行时进行
2) 宏展开时,仅仅是将宏体中的形参简单 地置换为实参,不计算实参值,也不会带来任何 返回值; 而函数调用要进行: l 计算实参值(假定用 2+3、 9–1作为实参将 被计算出来)、 l参数传递(将 5、8 传给形参x、y)、
这些文件要用到公用信息时,只要在文件 中加入#include “f.h”这么一行命令既可。这样 就不必在f1.c、…… 、fn.c每个文件中都去重 复定义这些公用的信息。
C程序5
10
v= S(5.2, 4.5, 3.0) ;
说明: 说明:
1.宏展开时,只是将实参串代替形参串. 宏展开时,只是将实参串代替形参串. 宏展开时 如: # define S( r)
PI*r*r; 若S(a+b)→ PI*a+b*a+b. +
出错,定义时应写成: 出错,定义时应写成:
20
练习
定义一个带参数的宏, 定义一个带参数的宏,实现两个 数的互换,并输出交换后的值。 数的互换,并输出交换后的值。 宏名: 宏名:S) t=b;b=a;a=t main() { int a,b,t; scanf(“%d,%d”,&a,&b); SWAP(a,b); printf(“a=%d,b=%d\n”,a,b); }
4
#define M 10 main( ) { int a[M],i; for(i=0;i<M;i++) scanf(“%d”,&a[i];}
预编译时,程序中所有的M被10替换。 预编译时,程序中所有的M 替换。 替换 要改变数组的个数,只需改变M的值。 要改变数组的个数,只需改变M的值。
5
说明
13
int max(int x,int y) { int z; z=x>y?x, y; return(z); } main( ) { int a,b,c,d,t; scanf(“%d,%d,%d,%d”,&a,&b,&c,&d); t=max(a+b,c+d); printf(“max=%d”,t); } ,
f1.c
#include “f3.c” #include “f2.c”
第九章预处理命令(5503)
1.下面叙述中正确的是(A )。
A.带参数的宏定义中参数是没有类型的B.宏展开将占用程序的运行时间C.宏定义命令是C语言中的一种特殊语句D.使用#include命令包含的头文件必须以“.h”为后缀2.在宏定义#define PI3.14159中,用宏名代替一个( D )A.常量B.单精度数C.双精度数D.字符串3.下面有关宏替换的叙述不正确的是( D )A.宏替换不占用运行时间B.宏名无类型C.宏替换只是字符替换D.宏名必须用大写字母表示4.C语言的编译系统对宏命令的处理是( D )A.在程序运行时进行的B.和C程序中的其他语句同时进行编译的C.在程序连接时进行的D.在对源程序中其它成分正式编译之前进行的5.下列定义不正确的是(C )。
A.#define PI 3.141592B.#define S345C.int max(x,y); int x,y; { }D.static char c6.有如下宏定义 #define s(a) a*3 ,则执行表达式x=s(1+2)后,变量x的值为( D)。
A.10B.9C.8D.77.以下说法中正确的是( D)。
A.#define是C语句B.#define是库函数C.#define是自定义函数D.#define是预处理命令8.在“文件包含”预处理语句的使用形式中,当#include后面的文件用了“”(双引号)时,寻找被包含文件的方式是(B)。
A.直接按系统设定的标准方式搜索目录B.先在源程序所在目录搜索,再按系统设定的标准方式搜索C.仅仅搜索源程序所在目录D.仅仅搜索当前目录9.以下叙述正确的是( B )。
A.可以把define和if定义为用户标识符B.可以把define定义为用户标识符,但不能把if定义为用户标识符C.可以把if定义为用户标识符,但不能把define定义为用户标识符D.define和if都不能定义为用户标识符10.以下叙述中正确的是( B )。
预处理命令
二、表演区 (一)什么是表演区 表演区以幼儿表演游戏为设计核心,通过道具吸引幼儿积极参加故事表 演、游戏等活动。 (二)表演区的环境布置与材料投放 表演区可以分为固定式和活动式表演区角两类。 固定式的表演区角是指在活动室内辟出一定区域,存放表演所需要的用 具。 活动式的表演区角则是根据表演需要,临时在走廊、门厅、过道或室外 等地方设置表演场所,便于及时放置和收拢。
第9章 预处理命令
• 9. 1 概述 • 9. 2 宏定义 • 9. 3 文件包含 • 9. 4 条件编译
9. 2 宏定义
• 9. 2. 1 无参宏定义
• 无参宏的宏名后不带参数。 • 其定义的一般形式为 • #define 标识符字符串 • 其中, #表示这是一条预处理命令; 凡是以#开头的指令均为预处理命
果果:“老师,一分钟是多久呢?” 教师:“就是一会儿,我一转身。” 贝贝:“我知道,最细的秒针走一圈,挺长的。” 佳佳:“一分钟就是我们从门口走到后面的窗子那里。” 教师:“一分钟能做什么?” 佳佳:“给花浇水。” 果果:“唱完一首歌。” 贝贝:“搬来一把椅子。”……
学习目标
1. 了解幼儿日常交谈的主要特点及指导要求。 2. 掌握语言区角的环境布置与材料投放要求,能科学地开展语言区角活 动的指导。 3. 学会设计听说游戏的玩法,并能评析幼儿园听说游戏。
上一页 下一页 返回
9. 2 宏定义
• 【例9 - 2】不作宏代换程序举例。
上一页 下一页 说明: • 虽然已定义宏名OK 表示100, 但在printf 语句中OK 被引号括起来, 因
此不作宏代换。 • 程序的运行结果为“OK”, 这表示把“OK” 当字符串处理。
上一页 下一页 返回
义时, 必须十分注意, 应保证在宏代换之后不发生错误。
C语言程序设计 第3版 第9章 编译预处理
#include "test2.c" static int sum(int n) {
int i,s=0; for(i=1;i<=n;i++)
s=s+fact(i); return s; }
static int fact(int n) {
C语言程序设计
第9章 编译预处理
第1讲:编译预处理基本形式
提纲
1.宏定义 2.文件包含 3.条件编译
1.宏定义
不带参数宏定义 带参数宏定义
格式:
#define 标识符 字符串
功能:
指定标识符代替一个较复杂的字符串。
注意说明:
(1)宏名一般习惯用大写字母,例如宏名PI。 (2)宏名用做代替一个字符串,不作语法检查。 (3)宏定义无需在末尾加“;” (4)宏定义的有效范围为#undef命令终止。 (5)在进行宏定义时,可以引用已定义的宏名。
char web[50]; int i=0; gets(web); while(web[i]!='\0') {
#if(R==1) if(web[i]>='A'&&web[i]<='Z') {web[i]=web[i]+32; i++;}
#else if(web[i]>='a'&&web[i]<='z') {web[i]=web[i]-32; i++;}
形式3:
#ifndef 标识符 程序段1
#else 程序段2
第9章预处理定义
C语言程序设计(第三版) My email:chenguot@
area=S(a); printf(“r=%f\narea=%f\n”,a,area);
area=3.1415926*a*a;
}
C语言程序设计(第三版) My email:chenguot@
10
§9.1 宏定义(7)
如下宏定义:
说明:
#define S (r) PI*r*r
⑴对带参数的宏的展开只是将语对句于中语的句宏名后面括号内的实
file1.c 或
file2.c
#include<file2.c>
#include <文件名> B
A
file1.c
A B
C语言程序设计(第三版) My email:chenguot@
16
§将包9.宏含2代到表用“文输户出程件格序包式中做:含出”头文处件理,并(2) (2)主文件file1.c
(好1处):将“格文式件宏包做含成”头命文令件可fo以rm节at.省h 程序设计void人m员ain的() 重复劳动。
#如inc:lud某e <单std位io.的h>人员往往使用一组固定的符号{ 常量(g=9.81,
#pdie=fi3n.e1P4R15p9ri2nt6f,e=2.718,c=…),可以把这些宏int定a,b义,c,d命; 令组成 ##一量定ddeeff个包义iinnee头含这ND文到些L“%“件自符\dn””,己号然所常后写量各的,人源相都文当可件于以中工用。业这上#in样的cl每标ud个准e命人零令cah=就件a1将r;b可,s=t这r2i以拿n;cg些=[不来]3=;符d“必就C=4号H;重用IN常A复。”;
C语言程序设计》基本知识点
C语言程序设计》基本知识点C语言程序设计》教学基本知识点第一章C语言基本知识1.C源程序的框架尽管各个C源程序的功能千变万化,但框架是不变的,主要有:编译预处理、主函数()、函数n()等,主函数的位置不一定在最前面,可以在程序的中部或后面,主函数的名字固定为main。
2.C语言源程序的书写规则:1)C源程序是由一个主函数和若干个其它函数组成的。
2)函数名后必须有小括号,函数体放在大括号内。
3)C程序必须用小写字母书写。
4)每句的末尾加分号。
5)可以一行多句。
6)可以一句多行。
7)可以在程序的任何位置加注释。
3.语句种类语句是程序的基本成分,程序的执行就是通过一条条语句的执行而得以实现的,根据表现形式及功能的不同,C语言的基本语句可以分为五大类。
1)流程控制语句流程控制语句的功能是控制程序的走向,程序的流程有三种基本结构:顺序结构、分支结构和循环结构,任何复杂的程序都可以由这三种基本结构复合而成。
其中后两种结构要用特定的流程控制语句实现。
2)表达式语句表达式语句的形式是:表达式。
即表达式后跟一分号“;”,分号是语句结束符,是一个语句必不可少的成分。
表达式和表达式语句的区别在于表达式代表的是一个数值,而表达式语句则代表一种动作。
最常见的表达式语句是赋值语句。
3)函数挪用语句函数挪用语句实践上也是一种表达式语句,形式为:在一次函数挪用的小括号后面加上一个分号。
(4)空语句空语句的形式就是一个分号,它不代表任何动作,常常作为一个意义迁移转变点利用。
5)复合语句复合语句从形式上看是多个语句的组合,但在语法意义上它只相当于一个语句,在任何单一语句存在的地方都可以是复合语句。
注意复合语句中最后一个语句末尾的分号不能少。
复合语句右大括号后面没有分号。
4.运算符用来表示数据各种操作的符号称为运算符。
运算符实际上代表了一种类型数据的运算规则。
不同的运算符具有不同的运算规则,其操作的数据类型必须符合该运算符的要求,运算结果的数据类型也是固定的。
C语言 选择题库第9章 编译预处理和动态存储分配
第9章编译预处理和动态存储分配1.以下叙述中正确的是()。
A) 在C语言中,预处理命令行都以"#"开头B) 预处理命令行必须位于C源程序的起始位置C) #include <stdio.h>必须放在C程序的开头D) C语言的预处理不能实现宏定义和条件编译的功能参考答案:A【解析】预处理命令是以"#"号开头的命令,它们不是C语言的可执行命令,这些命令应该在函数之外书写,一般在源文件的最前面书写,但不是必须在起始位置书写,所以B),C)错误。
C)语言的预处理能够实现宏定义和条件编译等功能,所以D)错误。
2.以下关于宏的叙述中正确的是()。
A) 宏替换没有数据类型限制B) 宏定义必须位于源程序中所有语句之前C) 宏名必须用大写字母表示D) 宏调用比函数调用耗费时间参考答案:A【解析】宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头,所以B)选项中宏定义必须位于源程序中所有语句之前是错误的。
宏名一般用大写,但不是必须用大写,所以C)选项错误。
宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值),所以D)选项错误。
3.有以下程序:#include <stdio.h>#define PT 3.5 ;#define S(x) PT*x*x ;main(){int a=1,b=2;printf("%4.1f\n" ,S(a+b));}程序运行后的输出结果是()。
A) 7.5 B) 31.5 C) 程序有错无输出结果D) 14.0参考答案:C【解析】宏定义不是C语句,末尾不需要有分号。
所以语句printf("%4.1f\n" ,S(a+b));展开后为printf("%4.1f\n" ,3.5;*a+b*a+b;);所以程序会出现语法错误。
第九章 预处理命令
第九章 预处理命令一、选择题1.以下叙述不正确的是 。
A)预处理命令行都必须以#开始B)在程序中凡是以#开始的语句行都是预处理命令行C)C程序在执行过程中对预处理命令行进行处理D)预处理命令行可以出现在C程序中任意一行上2.以下叙述中正确的是 。
A)在程序的一行上可以出现多个有效的预处理命令行B)使用带参数的宏时,参数的类型应与宏定义时的一致C)宏替换不占用运行时间,只占用编译时间D)C语言的编译预处理就是对源程序进行初步的语法检查3.以下有关宏替换的叙述不正确的是 。
A)宏替换不占用运行时间B)宏名无类型C)宏替换只是字符替换D)宏名必须用大写字母表示4.在“文件包含”预处理命令形式中,当#include后面的文件名用””(双引号)括起时,寻找被包含文件的方式是 。
A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录中搜索,再按系统设定的标准方式搜索C)仅仅搜索源程序所在目录D)仅仅搜索当前目录5.在“文件包含”预处理命令形式中,当#include后名的文件名用<>(尖括号)括起时,寻找被包含文件的方式是 。
A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录中搜索,再按系统设定的标准方式搜索C)仅仅搜索源程序所在目录D)仅仅搜索当前目录6.在宏定义#define PI 3.1415926中,用宏名PI代替一个 。
A)单精度数B)双精度数C)常量D)字符串7.以下程序的运行结果是 。
#include<stdio.h>#define ADD(x) x+xvoid main ( ){ int m=1,n=2,k=3,sum ;sum = ADD(m+n)*k ;printf(“%d\n”,sum) ;A)9 B)10 C)12 D)188.以下程序的运行结果是 。
#include<stdio.h>#define MIN(x,y) (x)>(y) ? (x) : (y)void main ( ){ int i=10, j=15 , k;k = 10*MIN(i,j);printf(“%d\n”,k);}A)10 B)15 C)100 D)1509.以下程序的运行结果是 。
第9章 宏定义1
说明:
4): 文件包含可用双撇号,也可用尖括号。 它们的区别是: 尖括号:系统到存放c库函数头文件的目录中寻找要 包含的文件 双撇号:系统先在用户当前目录中寻找,找不到再 按尖括号的方式寻找。 5):被包含的文件与其所在的文件在预编译后已变成同一 文件
条件编译:
1):一般情况下,源程序中所有的行都参加编译。但是有时希望对其 中一部分内容只在满足一定条件才进行编译,也就是对一部分内容 指定编译的条件,这就是“条件编译”。 2):表达形式: #ifdef 标识符 程序段1 #else 程序段2 #endif #ifndef 标识符 程序段1 #else 程序段2 #endif #if 表达式 程序段1 #else 程序段2 #endif
例9.5、用宏代表输出格式
#define PR printf #define NL "\n" #define D "%D" #define D1 D NL #define D2 D D NL #define D3 D D D NL #define D4 D D D D NL #define S "%S" main() {int a,B,C,D; char string[]="CHINA"; 1 a=1;B=2;C=3;D=4; 12 PR(D1,a); PR(D2,a,B); 123 PR(D3,a,B,C); 1234 PR(D4,a,B,C,D); CHINA PR(S,string); }
预处理的命令有以下几个特点: 1.预处理命令均以#开头,结尾不加分号; 2.预处理命令可以放在程序中任何位置,作用 范围从定义处到文件结尾。
宏定义:
1:不带参数的宏定义 1) 用一个指定的标识符来代替一个字符串 2) 它的一般形式: #define 标识符 字符串 3) 作用:把标识符定义为字符串。在进行编译预处理时,• 译 编 系统就能够把程序中出现的标识符,一律用字符串去替换,然后 再对替换处理后的源程序进行编译。
c程序设计(第2版)课后习题答案
c程序设计(第2版)课后习题答案C程序设计是一门基础的计算机编程课程,它教授学生如何使用C语言编写程序。
C语言是一种结构化编程语言,广泛用于系统软件、嵌入式系统和各种应用程序的开发。
以下是一些C程序设计课后习题的答案示例,这些答案仅供参考,具体习题的答案可能会有所不同。
第一章:C语言概述1. 简述C语言的特点。
- C语言是一种高级语言,同时具有汇编语言的效率。
- 它支持结构化编程,允许模块化设计。
- C语言具有丰富的运算符和数据类型。
- 它提供了指针功能,增强了编程的灵活性。
2. 描述C程序的基本结构。
- C程序由预处理指令、函数定义和主函数`main()`组成。
- 每个函数由函数声明、函数体和花括号包围的代码块组成。
第二章:数据类型、运算符和表达式1. 列出C语言的基本数据类型。
- 整型:`int`、`short int`、`long int`- 浮点型:`float`、`double`- 字符型:`char`- 枚举型:`enum`2. 解释赋值运算符的左结合性和右结合性。
- 赋值运算符是右结合性,意味着从右向左进行赋值。
第三章:控制语句1. 什么是条件语句?- 条件语句允许程序根据条件是否满足来执行不同的代码路径。
2. 描述循环语句的类型及其用法。
- `for`循环:用于已知迭代次数的循环。
- `while`循环:用于未知迭代次数,条件为真时循环。
- `do-while`循环:至少执行一次循环体,然后检查条件。
第四章:函数1. 函数的定义是什么?- 函数是一段具有特定功能的代码块,可以接收参数并返回值。
2. 解释函数原型和函数定义的区别。
- 函数原型声明了函数的名称、返回类型和参数列表,但不包含函数体。
- 函数定义包含了函数的完整实现,包括函数体。
第五章:数组1. 一维数组的声明和初始化方式。
- 声明:`type arrayName[arraySize];`- 初始化:`int arr[5] = {1, 2, 3, 4, 5};`2. 二维数组的访问方式。
第9章 预处理
C语言试题库(第9章)一、选择题1、宏定义#define PI 31.14159中,宏名PI代替______________。
A、浮点型B、整型C、常量D、字符串答案A 难度12、设有以下宏定义:#define N 3#define Y(n) ((N+1)*n)执行语句z=2*(N+Y(5+1));后,z的值为_____________。
A、出错B、42C、48D、54答案C 33、以下说法正确的是_____________。
A、#define和printf都是C语句B、#define 是C语句,而printf不是C、printf是C语句,但#define不是D、#define 和printf都不是C语句答案D 难度24、宏定义的宏展开是在__________阶段完成的。
A、第一遍编译B、第二遍编译C、程序执行D、预编译答案D 难度 15、编译预处理命令以___________结尾。
A、;B、.C、\D、回车答案D 难度16、以下叙述中正确的是________.a)在程序的一行上可以出现多个有效的预处理命令行b)使用带参的宏时,参数的类型应与宏定义时的一致c)宏替换不占用运行时间,只占用编译时间d)在以下定义中C R是称为“宏名”的标识符#define C R 045答案C 难度37、以下程序的运行结果是________.#define MIN(x,y) (x)<(y)?(x):(y)main(){int i=10,j=15,k;k=10*MIN(i,j);printf("%d\n",k);}a)10 b)15 c)100 d)150答案B 难度 48、若有宏定义如下:#define X 5#define Y X+1#define Z Y*X/2则执行以下printf语句后,输出结果是_______.int a;a=Y;printf("%d\n",Z);printf("%d\n",a);a)7 b)12 c)12 d)76 6 5 5答案 A 难度 29、请读程序:#include <stdio.h></P< p>#define MUL(x,y) (x)*ymain(){int a=3,b=4,c;c=MUL(a++,b++);printf("%d\n",c);}上面程序的输出结果是__________.a)12 b)15 c)20 d) 16答案A 难度410、对下面程序段:#define A 3#define B(a) ((A+1)*a)...x=3*(A+B(7));正确的判断是_________.a)程序错误,不许嵌套宏定义b)x=93c)x=21d)程序错误,宏定义不许有参数答案 B 难度311、以下正确的描述是____________.a)C语言的预处理功能是指完成宏替换和包含文件的调用b)预处理指令只能位于C源程序文件的首部c)凡是C源程序中行首以"#"标识的控制行都是预处理指令d)C语言的编译预处理就是对源程序进行初步的语法检查答案C 难度212、在"文件包含"预处理语句的使用形式中,当#include后面的文件名用< >(尖括号)括起时,找寻被包含文件的方式是_______.a)仅仅搜索当前目录b)仅仅搜索源程序所在目录c)直接按系统设定的标准方式搜索目录d)先在源程序所在目录搜索,再按照系统设定的标准方式搜索(双撇号的)答案 C 难度313、有以下程序#define F(X,Y)(X)*(Y)main(){ int a=3, b=4;printf("%d\n", F(a++, b++));}程序运行后的输出结果是()A)12 B)15 C)16 D)20 正确答案: A 难度414、以下叙述中不正确的是()A)预处理命令行都必须以#号开始B)在程序中凡是以#号开始的语句行都是预处理命令行C)宏替换不占用运行时间,只占编译时间D)在以下定义是正确的:#define PI 3.1415926;正确答案: D 难度 215、有如下程序:#define N 2#define M N+1#define NUM 2*M+1main(){ int i;for(i=1;i<=NUM;i++)printf("%d\n",i);}该程序中的for循环执行的次数是( )A)5 B)6 C)7 D)8 正确答案: B 难度416、以下程序的运行结果是( )#define MIN(x,y)(x)<(y)?(x):(y)main(){ int i=10,j=15,k;k=10*MIN(i,j);printf("%d\n",k);}A)10 B)15 C)100 D)150正确答案: B 难度 117、有如下定义#define D 2int x=5;float y=3.83;char c=′D′;则下面选项中错误的是 ( )A)x++; B)y++; C)c++; D)D++;正确答案: D 难度 418、以下程序段的执行结果为 ( )#define PLUS(X,Y)X+Ymain(){ int x=1,y=2,z=3,sum;sum=PLUS(x+y,z)*PLUS(y,z);printf("SUM=%d",sum);}A)SUM=9 B)SUM=12 C)SUM=18 D)SUM=28 正确答案: B 难度 319、下列程序的输出结果是 ( )#include "stdio.h"#defineM(x,y)x%ymain(){ int a,m=12,n=100;a=M(n,m);printf("%d\n",a--);}A)2 B)3 C)4 D)5 正确答案: C 难度420 、阅读下列程序段,则程序的输出结果为 ( )#include "stdio.h"#define M(X,Y)(X)*(Y)#define N(X,Y)(X)/(Y)main(){ int a=5,b=6,c=8,k;k=N(M(a,b),c);printf("%d\n",k);}A)3 B)5 C)6 D)8 正确答案: A 难度221、已知#define M 2;的宏定义,执行语句k=M*5;后,k的值是 ( )A)10 B)5 C)2 D)以上答案都不对正确答案: D 难度122、以下关于宏替换叙述中,错误的是 ( )A)宏替换占用编译时间 B)替换文本中可以包含已定义过的宏名C)宏名可以由+号组成 D)宏替换只能是字符替换正确答案: D 难度 223、以下程序的运行结果是________.#define MIN(x,y) (x)<(y)?(x):(y)main(){int i=10,j=15,k;k=10*MIN(i,j);printf("%d\n",k);}a)10 b)15 c)100 d)150答案B 难度 224、若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是()A)函数调用可以作为独立的语句存在B)函数调用可以作为一个函数的实参C)函数调用可以出现在表达式中D)函数调用可以作为一个函数的形参正确答案: D 难度125、以下正确的说法是()A)定义函数时,形参的类型说明可以放在函数体内B)return后边的值不能为表达式C)如果函数值的类型与返回值类型不一致,以函数值类型为准D)如果形参与实参类型不一致,以实参类型为准正确答案: C 难度226、以下正确的说法是()A)用户若需调用标准库函数,调用前必须重新定义B)用户可以重新定义标准库函数,若如此,该函数将失去原有含义C)系统根本不允许用户重新定义标准库函数D)用户若需调用标准库函数,调用前不必使用预编译命令将该函数所在文件包括到用户源文件中,系统自动调用正确答案: B 难度127、以下叙述正确的是()A)函数可以嵌套定义但不能嵌套调用B)函数既可以嵌套调用也可以嵌套定义C)函数既不可以嵌套定义也不可以嵌套调用D)函数可以嵌套调用但不可以嵌套定义正确答案: D 难度128、以下程序有语法错误,有关错误原因的正确说法是()main(){ int G=5,k;void prt_char();...k=prt_char(G);...}A)语句 void prt_char();有错,它是函数调用语句,不能用void说明B)变量名不能使用大写字母C)函数说明和函数调用语句之间有矛盾D)函数名不能使用下划线正确答案: C 难度 329、以下正确的函数头定义形式是()A)double fun(int x,int y)B)double fun(int x;int y)C)double fun(int x,int y);D)double fun(int x,y);正确答案: A 难度230、以下所列的各函数首部中,正确的是()A)void play(var :Integer,var b:Integer)B)void play(int a,b)C)void play(int a,int b)D)Sub play(a as integer,b as integer)正确答案: C 难度131 下面函数调用语句含有实参的个数为()func((exp1,exp2),(exp3,exp4,exp5));A)1B)2C)4D)5正确答案: B 难度432、有以下程序float fun(int x,int y){ return(x+y);}main(){ int a=2,b=5,c=8;printf("%3.0f\n",fun((int)fun(a+c,b),a-c));}程序运行后的输出结果是()A)编译出错B)9C)21D)9.0正确答案: B 难度233、下列程序执行后的输出结果是()void func1(int i);void func2(int i);char st[]="hello,friend!";void func1(int i){ printf("%c",st[i]);if(i<3) { i+=2;func2(i);}}void func2(int i){ printf("%c",st[i]);if(i<3) { i+=2;func1(i);}}main(){ int i=0; func1(i); printf("\n");}A)helloB)helC)hloD)hlm考生答案: 正确答案: C34、下列函数的运行结果是()main(){ int i=2,p;int j,k;j=i;k=++i;p=f(j,k);printf("%d",p);}int f(int a,int b){ int c;if(a>b) c=1;else if(a==b) c=0;else c=-1;return(c);}A)-1B)1C)2D)编译出错,无法运行正确答案: A 难度335、有以下函数 char * fun(char *p) { return p; } 该函数的返回值是()A、无确切的值B、形参p中存放的地址值C、一个临时存储单元的地址D、形参p自身的地址值正确答案:B 难度 136、下面程序应能对两个整型变量的值进行交换。
《软件工程专业基础综合(840)》考试大纲.doc
1、软件工程学概述
(1)软件工程的定义、性质、目标、内容、面临的问题
(2)软件生存周期概念
(3)软件过程概念
(4)软件过程模型:瀑布模型、快速原型模型、增量模型、螺旋模型、喷泉模型、Rational统一过程、敏捷过程与极限编程、微软过程
2、可行性研究
(1)可行性研究的任务
(2)系统流程图
(四)图的基本应用
1.最小生成树
2.最短路径五、查找
(一)查找的基本概念
(二)顺序杏找法
(三)折半查找法六、内部排序
(一)排序的基木概念
(二)插入排序
1.直接插入排序
2.折半插入排序
(三)起泡排序(bubble sort)
(四)简单选择排序
(五)希尔排序(shell sort)
(六)快速排序
(七)二路归并排序(merge sort)
3、需求分析
(1)需求分析的概念与基本任务
(2)结构化分析方法与步骤
(3)数据流图、数据流图中的符号、画数据流图注意的事项,分层的数据流图
(4)数据字典,数据字典的作用,数据字典中的条目
(5)实体关系图
第三部分 《软件工程导论》(占总分
参考书目:张海藩,《软件工程导论》(第5版),清华大学出版社2008年
一、考试要求
1.从总体上了解软件工程的产生、软件生产发展史、软件生存周期、务种方法和生存 周期模型、软件工程面临的问题
2.系统掌握软件开发最基本的内容:可行性研究和软件计划、需求分析、概要设计、 详细设计、编码、测试、维护,系统掌握这些阶段的bl标、任务、特点、步骤和文档
3.掌握结构化方法的基本思想,开发过程和步骤,应遵循的原则和准则
4.初步掌握面向对象方法的基木思想、基木概念、基木模型,面而对象分析、面向对 象设计、面向对象实现的任务、内容和步骤,能够应用相应的图形工具
C程序设计教程第二版习题答案
C程序设计教程第二版习题答案第1章:C语言概述1. 简述C语言的特点。
- C语言是一种结构化编程语言,具有高效、灵活、功能强大等特点。
它支持多种编程范式,包括过程式、面向对象和泛型编程。
2. C语言的发展历史。
- C语言由丹尼斯·里奇在20世纪70年代初期开发,最初用于UNIX操作系统的编写。
随着UNIX的流行,C语言也逐渐普及。
第2章:C语言基础1. 变量声明的规则。
- 变量声明必须指定数据类型,变量名必须以字母或下划线开头,可以包含字母、数字和下划线,但数字不能作为变量名的首位。
2. 常量的使用。
- 常量是在程序执行过程中不能被修改的值,可以用#define预处理指令定义,或者直接使用字面量。
第3章:控制语句1. if语句的使用。
- if语句用于根据条件执行不同的代码块。
基本语法为:`if (条件) { 执行代码 }`。
2. switch语句的使用。
- switch语句用于根据变量的值执行不同的代码块。
基本语法为:`switch (变量) { case 值1: 执行代码1; break; ... }`。
第4章:循环语句1. for循环的使用。
- for循环用于重复执行一段代码直到满足特定条件。
基本语法为:`for (初始化; 条件; 增量/减量) { 执行代码 }`。
2. while循环的使用。
- while循环在条件为真时重复执行代码块。
基本语法为:`while (条件) { 执行代码 }`。
第5章:函数1. 函数的定义和调用。
- 函数是一段具有特定功能的代码块,可以被重复调用。
定义函数的基本语法为:`返回类型函数名(参数列表) { 函数体 }`。
调用函数时使用:`函数名(参数)`。
2. 函数的参数传递。
- 参数传递可以是值传递或引用传递。
值传递时,函数内部对参数的修改不会影响到外部变量的值;引用传递则相反。
第6章:数组1. 一维数组的声明和使用。
- 一维数组的声明语法为:`类型数组名[大小]`。
数据库基础知识_习题
第1章数据库基础知识_习题一、选择题1.数据库系统与文件系统的主要区别是()。
D A.数据库系统复杂,而文件系统简单B.文件系统只能管理程序文件,而数据库系统能够管理各种类型的文件C.文件系统管理的数据量较少,而数据库系统可以管理庞大的数据量D.文件系统不能解决数据冗余和数据独立性问题,而数据库系统可以解决2.在关系数据库系统中,当关系的模型改变时,用户程序也可以不变,这是()。
BA.数据的物理独立性 B.数据的逻辑独立性C.数据的位置独立性 D.数据的存储独立性3.数据库三级模式中,用逻辑数据模型对用户所用到的那部分数据的描述是()。
AA.外模式 B.概念模式 C.内模式 D.逻辑模式4.以下对关系模型性质的描述,不正确的是()。
C A.在一个关系中,每个数据项不可再分,是最基本的数据单位B.在一个关系中,同一列数据具有相同的数据类型C.在一个关系中,各列的顺序不可以任意排列D.在一个关系中,不允许有相同的字段名5.关系数据库中的码是指()。
DA.能唯一决定关系的字段 B.不可改动的专用保留字C.关键的很重要的字段 D.能唯一标识元组的属性或属性集合6.自然连接是构成新关系的有效方法。
一般情况下,当对关系R和S使用自然连接时,要求R和S含有一个或多个共有的()。
DA.元组 B.行C.记录 D.属性7.在建立表时,将年龄字段值限制在18~40之间,这种约束属于()。
BA.实体完整性约束 B.用户定义完整性约束C.参照完整性约束 D.视图完整性约束8.在A ccess中,“表”是指()。
AA.关系 B.报表 C.表格D.表单9.在A ccess中,用来表示实体的是()。
CA.域 B.字段 C.记录D.表10.把E-R图转换成关系模型的过程,属于数据库设计的()。
BA.概念设计 B.逻辑设计 C.需求分析 D.物理设计二、填空题1.数据库是在计算机系统中按照一定的方式组织、存储和应用的。
支持数据库各种操作的软件系统叫。
二级c语言第九章预处理命令
如果在程序中有下面的语句: R1=Radium(100); 那么,在编译预处理时,宏展开的顺序为从左到右进行置换,如果字符串 中包含宏中的形参,则将其用程序语句中相应的实参来替代,而字符串中的 其它字符原样保留。 因此,在处理上述语句时,将用 sqrt(area/PI) 替代 Radium(100),同时将 字符串sqrt(area/PI)中的形参area用实参l00来替代,并把已定义的宏PI的值代 入,经宏展开后,该语句变为“ R1=sqrt(100/3.14159); ”。
内蒙古科技大学 工程训练中心
预处理命令概述
所谓预处理,就是指源程序被正式编译之前所进行的处理工作,这 是C语言和其他高级语言之间的一个重要区别。
所有的预处理指令均以“#”开头,在它前面不能出现空格以外的字 符,而且在行结尾处没有分号。 “预处理命令” 的作用不是实现程序的功能,它们是发布给编译系 统的信息。它们告诉编译系统,在对源程序进行编译之前应该做些什么, 所以称这类语句为编译预处理命令。 C语言在执行一个C程序时,如果程序中有预处理命令,则首先进行 编译预处理(即根据预处理命令对源程序进行预先处理),然后再将经过 预处理的源程序编译成目标文件,而后进行目标文件的连接,当这些工 作都顺利通过后,才最终执行目标代码。这种执行过程大大提高了编程 效率。
PI 的有效范围
因为#undef 的作用是终止宏定义,因此PI的作用域从它定义开始到 #undef结束。在这以后,如果程序中出现 PI,则它不代表3.14159 。使 用#undef可以灵活控制宏定义的作用范围。
2019年1月8日5时29分 工程训练中心 徐国海
(二)带参数宏定义 (了解) 定义的一般格式为: #define 宏名(形式参数列表) 字符串
c程序设计第三版笔记
c程序设计第三版笔记C程序设计第三版笔记C语言是一种广泛使用的计算机编程语言,以其高效性、灵活性和强大的功能而闻名。
《C程序设计》第三版是一本经典的C语言教材,由Brian W. Kernighan和Dennis M. Ritchie共同编写,后者也是C语言的共同创造者。
以下是根据该教材整理的一些关键笔记。
第1章:C语言简介- C语言的特点:简洁、结构化、高效。
- 程序的基本结构:预处理器指令、函数、变量声明、语句和表达式。
- 基本数据类型:整型(int)、字符型(char)、浮点型(float)和双精度型(double)。
第2章:数据类型、运算符和表达式- 变量声明:类型说明符和变量名。
- 常量:整数常量、浮点常量、字符常量和字符串常量。
- 运算符:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符。
- 表达式求值:优先级和结合性。
第3章:控制语句- 条件语句:if、if...else、switch。
- 循环语句:while、do...while、for。
- 跳转语句:break、continue、goto、return。
第4章:函数- 函数定义:返回类型、函数名、参数列表、函数体。
- 函数调用:参数传递、返回值。
- 作用域规则:局部变量、全局变量。
- 递归函数:递归调用和基础情况。
第5章:指针- 指针变量:声明和初始化。
- 指针与数组:数组名作为指针使用。
- 指针与函数:指针作为参数、返回指针的函数。
- 指针的指针和动态内存分配。
第6章:结构体和其他数据类型- 结构体:定义、初始化、访问成员。
- 联合体:内存共享特性。
- 枚举类型:定义和使用。
- 位字段:存储位模式。
第7章:预处理器- 宏定义:#define和#undef。
- 文件包含:#include。
- 条件编译:#ifdef、#ifndef、#endif。
第8章:输入和输出- 标准库函数:printf、scanf。
- 格式化输出:格式说明符。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
注意:
实参r的值已知,可以从宏带回3个值(l,S, v)。其实,只不过是字符代替而已,将字符r 代替R,l代替L,S代替S,v代替V,而并未 在宏展开时求出l、S、v的值。
5.带参的宏和带参函数区别
(5) 使用宏次数多时,宏展开后源程序长,因为每展开一次都使程序 增长,而函数调用不使源程序变长。 (6) 宏替换不占运行时间,只占编译时间。而函数调用则占运行时间 (分配单元、保留现场、值传递、返回)。 一般用宏来代表简短的表达式比较合适。有些问题,用宏和 函数都可以。如: #define MAX(x,y) (x)>(y)?(x)∶(y) 赋值语句展开后为 main() t=(a+b)>(c+d)?(a+b)∶(c+d); {int a,b,c,d,t; t=MAX(a+b,c+d); } 注意:MAX不是函数,这里只有一个 main函数,中就能求出t的值。
7):宏定义只作字符替换,不分配内存空间 8) :对程序中用双撇号括起来的字符串原样输出
3、无参宏的应用举例
例 9.1 不带参数的宏的程序
#include <stdio. h> #define PI 3.115926 #define STRING This is a test main( ) { float r, s; printf (“ STRING \n"); scanf ("%f", &r); s=PI*r*r; printf (“ s=%10.3f\n",s); }
例:使用带参数的宏
#include<stdio.h> #define PI 3.1415926 #define s(r) PI*r*r void main() { float a,area; a=3.6; area=s(a); printf(“r=%f\narea=%f\n”,a,area); }
说明:
4): 文件包含可用双撇号,也可用尖括号。 它们的区别是: 尖括号:系统到存放c库函数头文件的目录中寻找要 包含的文件 双撇号:系统先在用户当前目录中寻找,找不到再 按尖括号的方式寻找。 5):被包含的文件与其所在的文件在预编译后已变成同一 文件
条件编译:
1):一般情况下,源程序中所有的行都参加编译。但是有时希望对其 中一部分内容只在满足一定条件才进行编译,也就是对一部分内容 指定编译的条件,这就是“条件编译”。 2):表达形式: #ifdef 标识符 程序段1 #else 程序段2 #endif #ifndef 标识符 程序段1 #else 程序段2 #endif #if 表达式 程序段1 #else 程序段2 #endif
条件编译实例2
#include <stdio.h> #define MAX 10 main() { #if MAX>99 printf("compile for array greater than 99"); #else printf("compile for small array"); #endif }
5.带参的宏和带参函数区别
(1)在函数调用时,是先求出实参表达式的值,再传递给形参, 而宏定义只是简单的字符替换;例如上面的S(a+b),在宏展开时并不 求a+b的值,而只将实参字符“a+b”代替形参r (2)函数调用是在程序运行时处理的,分配存储单元,而宏展开 (调用)是在编译预处理时进行的,展开时不分配内存单元,不进行 值传递,没有返回值的概念; (3)对函数实参和形参都要定义类型,而宏不存在类型,宏定义 时字符串可以是任何类型数据,一律看成字符串,宏名也没类型,只 是一个符号表示,展开时代入指定的符号即可。 如:#define CHAR1 CHINA(字符) #define a 3.6 (数值)
#include<stdio.h> #define PI 3.1415926 void main() { float s,v,r,l; printf("请输入半径长度:"); scanf("%f",&r); l=2.0*PI*r; s=PI*r*r; v=4.0/3*PI*r*r*r; printf("l=%10.4f\ns=%10.4f\nv=%10.4f\n",l,s,v); }
宏定义:
1:不带参数的宏定义 1) 用一个指定的标识符来代替一个字符串 2) 它的一般形式: #define 标识符 字符串 3) 作用:把标识符定义为字符串。在进行编译预处理时,• 译 编 系统就能够把程序中出现的标识符,一律用字符串去替换,然后 再对替换处理后的源程序进行编译。
例:使用不带参数的宏定义
第9章
编译预处理
学习目标:
掌握宏定义、无参宏、有参宏、符号常量 掌握文件包含的意义 教学重、难点: 宏定义(重) 文件包含的使用(重) 条件编译(重、难点)
编译预处理是指,在对源程序进行编译之前, 系统将自动引用预处理程序对源程序中的预处理部 分作处理;然后再将处理的结果,和源程序一起进 行编译,以得到目标代码。
NUM宏展开: 2*N+1+1 再宏展开: 2*2+1+1
带参数的宏定义
1) :带参数的宏定义不是简单的字符替换,还要进 行参数替 换。 2) : 它的一般定义形式: #define 宏名(参数表) 字符串 字符串中包含在括弧中所指定的参数。如: #define s(a,b) a*b area=s(3,2); 定义矩形面积S,a和B是边长。在程序中用了s(3,2),把3、2分别 代替宏定义中的形式
2. 关于不带参数的宏定义的几点说明:
(1)宏名一般用大写字母表示,便于与变量名区别;一般将字符个数较多的字 符串用一个宏名替换,减少程序中多处引用字符串书写错误。 (2)宏定义是用宏名来表示一个字符串,在宏展开时以该字符串取代宏名, 这只是一种简单的代换, 预处理程序对它不作任何检查。如有错误,只能在编 译已被宏展开后的源程序时发现。 (3)宏定义不是语句,在行末不加分号,如加上分号则连分号也一起置换。 (4)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如
5.带参的宏和带参函数区别
(4) 调用函数只可得到一个返回值,而用宏可以设法得到几个结果。 #define PI3.1415926 #define CIRCLE(r,l,s, v)L=2*PI*R;S=PI*R*R;v=4.0/3.0*PI*R*R*R main() {float r,l,s,v; scanf("%f",&r); CIRCLE(r,l,S,v); printf("r=%6.2f,l=%6.2f, S=%6.2f, v=%6.2f\n",r,l,S, 运行情况如下:3.5 v);} r= 3.50,l= 21.99, S= 38.48,v= 179.59
例如:
#define G 9.8 void main() { … } #undef G f1() { …
}
_______ ↑ G的有效范围 -----↓----
2. 关于不带参数的宏定义的几点说明:
(5) 宏定义可以嵌套,但嵌套的宏定义名要是已经定义的宏名。在宏展 开时由预处理程序层层替换。例如: #define R 14.256 #define PI 3.1415926 #define S PI*R*R /* PI、R是已定义的宏名*/ 则语句 printf ("%f", s);在宏代换后变为 printf ("%f",3.1415926*14.256*14.256); (6)可用宏定义表示数据类型,使书写方便。 例如: #define STU int 在程序中可用STU替换数据类型int。
运行结果如下: r=3.600000 area=40.715038
带参宏定义说明:
(1) 对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符 串代替#define命令行中的形参。但是,如果有以下语句: area=S(a+B);这时把实参a+B代替PI*r*r中的形参r,成为 area=PI*a+B*a+B;请注意在a+B外面没有括弧,显然这与程序设 计者的原意不符。原意希望得到area=PI*(a+B)*(a+B);为了得到 这个结果,应当在定义时,在字符串中的形式参数外面加一个 括弧。即#define S(r) PI*(r)*(r)在对S(a+B)进行宏展开时,将 a+B代替r,就成了PI*(a+B)*(a+B)这就达到了目的。 (2) 在宏定义时,在宏名与带参数的括弧之间不应加空格,否则将 空格以后的字符都作为替代字符串的一部分。例如,如果有 #define s (r)PI*r*r 被认为s是符号常量(不带参的宏名),它代表字符串“(r) PI*r*r”。 如果在语句中有area=S (a); 则被展开为area=(r) PI*r*r (a) 显然不对了。
说明:
1): 一个#include命令只能指定一个被包含文件,如果 要包含n个文件,要用n个#include命令。 2) :如果文件1包含文件2,而在文件2中要用到文件 3的内容,则可在文件1中用两个include命令分别包 含文件2和文件3,而且文件3应出现在文件2之前。 3): 在一个被包含文件中又可以包含另一个被包含文件, 即文件包含是可以嵌套的。
宏定义不是C语句,所以不能在行尾加 Nhomakorabea号。否则,宏
展开时,会将分号作为宏体中 的1个字符。
在宏展开时,预处理程 序仅以宏体替换宏名,而不 作任何检查
【提问】以下这道题目的结果是多少?
例9.3 #define N 2 #define M N+1 #define NUM 2M+1 main( ) { int i; for (i=1; i<=NUM; i++) printf (“ %d \n”, i ); } 宏展开后的等价程序如下: main( ) { int i; for (i=1; i<=6; i++) printf(“ %d \n”, i ); }