• 易出错的C语言题目之一:宏定义与预处理


    1、写出下列代码的运行结果:

    #include<stdio.h>
    #include<string.h>
    #define STRCPY(a,b) strcpy(a##_p,#b)
    
    int main(){
        char var1_p[20];
        char var2_p[30];
    
        strcpy(var1_p,"aaaa");
        strcpy(var2_p,"bbbb");
    
        STRCPY(var1,var2);
        STRCPY(var2,var1);
    
        printf("var1 = %s/n",var1_p);
        printf("var2 = %s/n",var2_p);
    
        printf("
    ");
    
        return 0;
    }

    答案:

    var1 = var2/nvar2 = var1/n

    解析:

    #为字符串化操作符,将所连接的部分转化为一个字符串,##为字符串连接符,将两个字符串连接成一个字符串,均在预处理时完成字符串的替换。

    2、写出下列代码的运行结果:

    #include<stdio.h>
    
    #define f(a,b) a##b
    #define g(a) #a
    #define h(a) g(a)
    
    int main(){
        printf("%s
    ",h(f(1,2)));
        printf("%s
    ",g(f(1,2)));
        return 0;
    }

    答案:

    12
    f(1,2)

    解析:

    本题考察字符串化操作符#得作用得执行过程,以及宏定义替换的次序。如果该宏为带#号的宏定义,则直接替换字符串,无需再嵌套替换,如果该宏不是带#的宏,则先替换括号内部的宏定义,然后替换外部的。

    3、定义一个宏,求一个结构体struct中某个变量相对于struct的偏移量

    答案:

    #define OFFSET(struct, member)  ((unsigned int)&((struct *)0)->member)

  • 相关阅读:
    Adobe Flash Player 设置鼠标点不到允许或者拒绝!
    bzoj2096
    bzoj2789
    LA3353
    poj2594
    bzoj2427
    bzoj1076
    bzoj2818
    bzoj3668
    bzoj2006
  • 原文地址:https://www.cnblogs.com/AndyJee/p/5220981.html
Copyright © 2020-2023  润新知