📜  C |宏和预处理器|问题12(1)

📅  最后修改于: 2023-12-03 14:59:38.289000             🧑  作者: Mango

C |宏和预处理器|问题12

在C语言中,宏和预处理器是非常重要的概念。宏是一种在编译时进行文本替换的机制,它可以帮助编程人员快速定义常量、函数和类似函数的代码块等。预处理器是在编译器实际编译代码之前执行所必需的操作,其中包括宏替换、条件编译、头文件包含等操作。

本篇文章将聚焦于宏和预处理器的问题12。

问题描述

下面给出了一个宏定义,该宏在将输入转换为小写字母后将其输出到标准输出。请问在使用这个宏时,下列哪些函数调用的结果输出的是"hello, world!"?

#define TOLOWER(c) (c >= 'A' && c <= 'Z' ? c + 'a' - 'A' : c)

printf("Hello, World!\n");
printf("hello, world!\n");
printf("hELLO, wORLD!\n");
printf("%s\n", "Hello, World!");
printf("%s\n", "hello, world!");
printf("%s\n", "hELLO, wORLD!");
printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",
    TOLOWER('H'), TOLOWER('e'), TOLOWER('l'), TOLOWER('l'), TOLOWER('o'), TOLOWER(','),
    TOLOWER(' '), TOLOWER('w'), TOLOWER('o'), TOLOWER('r'), TOLOWER('l'), TOLOWER('d'), TOLOWER('!'));

问题分析

这个宏定义为TOLOWER(c)。它将输入转换为小写字母并输出到标准输出。由于这个宏定义是不区分大小写的,所以下列函数调用输出的结果都是"hello, world!"。

  • printf("Hello, World!\n");
  • printf("hello, world!\n");
  • printf("hELLO, wORLD!\n");
  • printf("%s\n", "Hello, World!");
  • printf("%s\n", "hello, world!");
  • printf("%s\n", "hELLO, wORLD!");
  • printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", TOLOWER('H'), TOLOWER('e'), TOLOWER('l'), TOLOWER('l'), TOLOWER('o'), TOLOWER(','), TOLOWER(' '), TOLOWER('w'), TOLOWER('o'), TOLOWER('r'), TOLOWER('l'), TOLOWER('d'), TOLOWER('!'));
代码示例
#include <stdio.h>

#define TOLOWER(c) (c >= 'A' && c <= 'Z' ? c + 'a' - 'A' : c)

int main(){
    printf("Hello, World!\n");
    printf("hello, world!\n");
    printf("hELLO, wORLD!\n");
    printf("%s\n", "Hello, World!");
    printf("%s\n", "hello, world!");
    printf("%s\n", "hELLO, wORLD!");
    printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",
            TOLOWER('H'), TOLOWER('e'), TOLOWER('l'), TOLOWER('l'), TOLOWER('o'), TOLOWER(','),
            TOLOWER(' '), TOLOWER('w'), TOLOWER('o'), TOLOWER('r'), TOLOWER('l'), TOLOWER('d'), TOLOWER('!'));
    return 0;
}

输出结果:

Hello, World!
hello, world!
hELLO, wORLD!
Hello, World!
hello, world!
hELLO, wORLD!
hello, world!