C 预处理器测试(测验)

2025年3月28日 | 阅读 5 分钟

1) 在哪个阶段,下面的代码会被文件 #include<stdio.h> 的内容替换?

  1. 链接期间
  2. 编辑期间
  3. 预处理期间
  4. 执行期间

正确选项是 (c)。

说明

在预处理阶段,行 #include<stdio.h> 会被同名系统头文件的内容替换成stdio.h 文件内容。

因此,文件 'stdio.h' 的全部文本会被 #include 指令替换。

2) C 预处理器指令 #undef 可以用于之前已 #define 的宏。

  1. true
  2. False

正确选项是 (a)。

说明

正确,指令 #undef 只能用于程序中之前已 #define 的宏。

例如:#define PI 3.14

我们可以通过 #undef PI 来取消定义 PI 宏。

3) C 预处理器指令 #ifdef...#elif?#endif 用于条件编译。

  1. true
  2. False

正确选项是 (a)。

说明

正确,C 宏如 #ifdef...#elif?#endif 用于在 C 程序中执行条件操作。

C 预处理器指令的语法是

4) 下面的程序会输出什么?

  1. x=10 , y=20
  2. x=20, y=10
  3. 错误:未定义符号 't'
  4. 错误:宏中不允许声明

正确选项是 (b)。

说明

宏语句 SWAP(x, y) int t; t=x, x=y, y=t; 交换给定两个变量的值。

步骤 1: int x=10, y=20; 变量 x 和 y 被声明为整型并分别初始化为 10, 20。

步骤 2: SWAP(x, y);。此处宏被替换,它交换变量 x 和 y 的值。

因此,程序的输出是 x=20, y=10。

5) 以下哪个是 C 语言中正确形成的 #define 语句?

  1. #define CUBE(x) (X*X*X)
  2. #define CUBE(X) {X*X*X}
  3. #define CUBE (X) X*X*X
  4. #define CUBE(X) (X)*(X)*(X)

正确选项是 (d)。

说明

带参数的宏定义的语法是

  • 宏的名称与其 '(参数)' 之间不应有空格。
  • 作为宏参数使用的变量是区分大小写的,并且其展开应相同。即 'x' 和 'X' 是不同的变量。
  • 宏展开应包含在括号 '( )' 中(不要使用 { } 或 [ ])。

6) 下面的程序会输出什么?

  1. j 的平方=9
  2. j=3
  3. 编译错误
  4. 无输出

正确选项是 (a)。

说明

程序中 #ifdef, #else 和 #endif 是预处理器命令。

如果宏 DEF 通过 #define 语句定义,则 #ifdef 后面的代码被编译,否则 #else 和 #endif 命令之间的代码被执行。由于 DEF 已被定义,#ifdef DEF 求值为真,因此计算并打印 'j' 的平方,即 9。

在定义宏 DEF 时,不一定需要为宏语句提供展开,因为在程序中我们不使用宏展开的值。

因此,程序的输出是 j 的平方=9。

7) 下面的程序会输出什么?

  1. 总工资=1000
  2. 总工资=1400
  3. 编译错误
  4. 无输出

正确选项是 (b)。

说明

当预处理器将程序发送给编译器时,IT, HRA 和 DA 分别被替换为 0.1, 0.2 和 0.3。当 bas_sal 设置为 1000 时,净工资计算如下:

语句printf("Gross salary=%f\n", net_sal); 打印结果。因此,输出是 Output

总工资=1400

8) 头文件必须具有 .h 扩展名吗?

  1. 是的
  2. 不能

正确选项是 (b)。

说明

不,头文件可以有任何扩展名。不一定要求头文件必须具有 .h 扩展名。

9) 哪个头文件用于支持函数 - malloc() 和 calloc()?

  1. stdio.h
  2. math.h
  3. stdlib.h
  4. memory.h

正确选项是 (c)。

说明

void *calloc(size_h nitems, size_h size): 函数 calloc() 需要双参数。

void *malloc(size_h size): 函数 malloc() 需要单参数。

为了支持函数 - malloc() 和 calloc(),需要 **stdlib.h** 头文件。

10) 宏语句的执行速度可能比函数快。

  1. true
  2. False

正确选项是 (a)。

说明

宏语句的执行速度更快,没有上下文切换的开销,因为宏的代码在调用行处展开。

因此,上述陈述是正确的。


11) 下面的程序会输出什么?

  1. Hello\n Welcome to javatpoint\n
  2. Hello Welcome to javatpoint
  3. Hello Welcome to javatpoint
  4. 编译错误

正确选项是 (b)。

说明

  • 文件名也可以用作展开的名称。
  • 预处理器指令 #include 可以在程序的任何位置使用。

预处理期间,宏 MYFILE 被替换为 <stdio.h>,然后程序被编译和执行,如下所示:

因此,程序的输出是

Hello

Welcome to javatpoint

12) 如果一个头文件在程序中被包含两次,是否会导致错误?

  1. 是的
  2. 不能
  3. 这取决于编译器

正确选项是 (c)。

说明

在 GCC 编译器和 Turbo C 中,编译器会处理这些问题,不会产生任何错误。在其他编译器中,可能会发生错误。

除非头文件已做好处理,确保如果已包含则不再包含。

因此,程序中由于两次包含头文件而产生的错误是 **取决于编译器**。

13) 预处理器可以捕获简单的错误,如嵌套注释、括号不匹配或缺少声明。

  1. true
  2. False

正确选项是 (b)。

说明

该陈述是错误的,因为预处理器无法捕获错误;它只能用给定表达式替换宏。

编译器用于检测程序中的错误。

14) 在每个 C 程序中,至少有一个预处理器指令。

  1. true
  2. False

正确选项是 (b)。

说明

该陈述是错误的,因为任何 C 程序都不是强制要求预处理器指令的。我们也可以在 C 语言中编写一个不使用任何预处理器指令的程序。

15) 下面的程序会输出什么?

  1. 5
  2. 9
  3. 8
  4. 6

正确选项是 (d)。

说明

宏 MAX(x, y) (x > y ? x : y) 返回给定两个数中较大的那个。

步骤 1: int a; 变量 'a' 被声明为整型。

步骤 2: a = MAX(3+1, 2+4); 变为,

=> a = (3+1 > 2+4 ? 3+1 : 2+4)

=> a = (4 > 6 ? 4 : 6)

=> a = 6

步骤 3: printf("%d\n", a); 打印变量 'a' 的值。

因此,程序的输出是 6。

下一主题C 命令行参数