第52练 第10章 无参宏定义与带参宏定义《C语言程序设计》(电子工业出版社)一课一练
|
2份
|
6页
|
39人阅读
|
0人下载
内容正文:
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《C语言程序设计》(电子工业出版社)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《C语言程序设计》(电子工业出版社)一课一练的第10章的第52练,内容涵盖第10章预处理命令的10.1 无参宏定义与带参宏定义。
《C语言程序设计》(电子工业出版社)一课一练 第52练
第10章 预处理命令
10.1 无参宏定义与带参宏定义
1、 单项选择题(本题共4小题)
1、下列无参宏定义的写法中,会导致宏替换后出现语法错误的是( )
A. #define PI 3.14159
B. #define SUM (a+b)
C. #define MAX_NUM 100;
D. #define GREET "Hello"
2、已知带参宏定义#define MUL(x) x*x,执行语句int a = MUL(2+3);后,a 的值是( )
A. 25
B. 11
C. 10
D. 9
3、关于宏定义的作用域,下列描述正确的是( )
A. 宏定义的作用域一定是整个源文件
B. 可以使用#undef命令提前终止宏定义的作用域
C. 宏定义写在函数内部时,作用域为该函数
D. 不同源文件的宏定义可以互相共享
4、下列关于带参宏和函数的核心区别,描述正确的是( )
A. 带参宏是预编译阶段的字符替换,函数是运行阶段的值传递
B. 带参宏和函数都会检查参数的类型是否匹配
C. 带参宏调用时会分配内存,函数不会
D. 带参宏和函数的参数都需要定义数据类型
2、 判断题(本题共3题)
1、宏定义允许嵌套,即可以在一个宏定义的字符串中使用已经定义的宏名。( )
2、带参宏调用时,会像函数一样进行实参到形参的值传递,并且会检查参数的类型是否匹配。( )
3、宏定义的作用域默认是从定义处开始,到源文件结束,无法提前终止。( )
3、 填空题(本题共2题)
1、在 C 语言中,定义宏的预处理命令关键字是____,它用于将指定的宏名替换为对应的字符串。
2、带参宏定义中,宏名和形参表之间____(填 “能” 或 “不能”)有空格,否则会被预处理程序识别为无参宏定义。
4、 读程序写结果题(本题共1题)
1、阅读下面的 C 语言程序,写出程序运行后的输出结果。
【程序代码】
#include <stdio.h>
#define SQUARE(x) x*x
int main() {
int num = 3;
printf("运算结果:%d
", SQUARE(num + 1));
return 0;
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《C语言程序设计》(电子工业出版社)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《C语言程序设计》(电子工业出版社)一课一练的第10章的第52练,内容涵盖第10章预处理命令的10.1 无参宏定义与带参宏定义。
《C语言程序设计》(电子工业出版社)一课一练 第52练
第10章 预处理命令
10.1 无参宏定义与带参宏定义
1、 单项选择题(本题共4小题)
1、下列无参宏定义的写法中,会导致宏替换后出现语法错误的是( )
A. #define PI 3.14159
B. #define SUM (a+b)
C. #define MAX_NUM 100;
D. #define GREET "Hello"
【答案】C
【解析】宏定义行末不能加分号,否则预处理时会将分号作为替换字符串的一部分代入,导致编译错误。A、B、D 的写法均符合无参宏定义的语法规则。
2、已知带参宏定义#define MUL(x) x*x,执行语句int a = MUL(2+3);后,a 的值是( )
A. 25
B. 11
C. 10
D. 9
【答案】B
【解析】带参宏是简单字符代换,MUL(2+3)会直接替换为2+3*2+3,根据运算优先级先算乘法,结果为 2+6+3=11。若要得到 25,宏定义应改为#define MUL(x) (x)*(x)。
3、关于宏定义的作用域,下列描述正确的是( )
A. 宏定义的作用域一定是整个源文件
B. 可以使用#undef命令提前终止宏定义的作用域
C. 宏定义写在函数内部时,作用域为该函数
D. 不同源文件的宏定义可以互相共享
【答案】B
【解析】宏定义默认作用域从定义处到源文件结束,可通过#undef命令提前终止;宏定义必须写在函数外部,不能写在函数内部;宏定义的作用域仅限当前源文件,无法跨文件共享,因此只有 B 正确。
4、下列关于带参宏和函数的核心区别,描述正确的是( )
A. 带参宏是预编译阶段的字符替换,函数是运行阶段的值传递
B. 带参宏和函数都会检查参数的类型是否匹配
C. 带参宏调用时会分配内存,函数不会
D. 带参宏和函数的参数都需要定义数据类型
【答案】A
【解析】带参宏是预编译阶段的简单字符代换,不检查参数类型,也不分配内存;函数是运行阶段的调用,会进行参数类型检查和值传递,参数需要定义类型,二者核心区别在于处理阶段和实现逻辑。
2、 判断题(本题共3题)
1、宏定义允许嵌套,即可以在一个宏定义的字符串中使用已经定义的宏名。( )
【答案】√
【解析】根据 C 语言宏定义规则,宏支持嵌套定义,预处理时会按照定义顺序层层代换,例如先定义#define PI 3.14,再定义#define AREA PI*r*r,替换时会将AREA中的PI替换为 3.14。
2、带参宏调用时,会像函数一样进行实参到形参的值传递,并且会检查参数的类型是否匹配。( )
【答案】×
【解析】带参宏是预编译阶段的简单字符替换,不存在值传递过程,也不会对参数的类型进行检查,这是带参宏与函数的核心区别。
3、宏定义的作用域默认是从定义处开始,到源文件结束,无法提前终止。( )
【答案】×
【解析】可以使用#undef命令提前终止宏定义的作用域,例如#define PI 3.14后,执行#undef PI,后续代码中PI将不再生效。
3、 填空题(本题共2题)
1、在 C 语言中,定义宏的预处理命令关键字是____,它用于将指定的宏名替换为对应的字符串。
【答案】#define
【解析】#define是 C 语言定义无参宏和带参宏的专用关键字,所有宏定义都必须以该命令开头。这是宏定义的基础语法要求,是使用宏功能的核心标识。
2、带参宏定义中,宏名和形参表之间____(填 “能” 或 “不能”)有空格,否则会被预处理程序识别为无参宏定义。
【答案】不能
【解析】如果宏名和形参表之间添加空格,预处理程序会将空格后的内容全部视为宏替换的字符串,将带参宏误判为无参宏,导致宏调用时出现语法错误。这是带参宏定义的关键语法细节。
4、 读程序写结果题(本题共1题)
1、阅读下面的 C 语言程序,写出程序运行后的输出结果。
【程序代码】
#include <stdio.h>
#define SQUARE(x) x*x
int main() {
int num = 3;
printf("运算结果:%d
", SQUARE(num + 1));
return 0;
}
【答案】
程序运行结果:
运算结果:7
【解析】
带参宏的替换是预编译阶段的简单字符代换,SQUARE(num + 1)会被直接替换为num+1*num+1,代入num=3后表达式为3+1*3+1。根据运算优先级先计算乘法,再计算加法,最终结果为 3+3+1=7,这体现了带参宏定义时形参未加括号会导致运算逻辑偏离预期的常见错误。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$