zoukankan      html  css  js  c++  java
  • (转) 宏的副作用

    试题3:写一个标准MIN,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事?

     

    least = MIN(*p++, b);

      解答:

     

    #define MIN(A,B) ((A) <= (B) ? (A) : (B))

      MIN(*p++, b)会产生宏的副作用

     

      剖析:

     

      这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的参数也不是真的参数,在宏展开的时候对参数进行的是一对一的替换。

     

      程序员对宏定义的使用要非常小心,特别要注意两个问题:

     

      (1)谨慎地将宏定义中的参数和整个宏用用括弧括起来。所以,严格地讲,下述解答:

     

    #define MIN(A,B) (A) <= (B) ? (A) : (B)

    #define MIN(A,B) (A <= B ? A : B )

      都应判0分;

     

      (2)防止宏的副作用。

     

      宏定义#define MIN(A,B) ((A) <= (B) ? (A) : (B))MIN(*p++, b)的作用结果是:

     

    ((*p++) <= (b) ? (*p++) : (*p++))

     

      这个表达式会产生副作用,指针p会作三次++自增操作。

     

      除此之外,另一个应该判0分的解答是:

     

    #define MIN(A,B) ((A) <= (B) ? (A) : (B));

      这个解答在宏定义的后面加“;”

  • 相关阅读:
    axios的使用/
    jQuery好玩的双向控制轮播
    vue的路由跳转方式/两种
    vfor的某些注意事项
    vue使用插件时不能撑满页面?
    swiper中的双向控制器不生效问题
    sass的安装及使用
    .net必懂题
    软件架构初读01
    EJB
  • 原文地址:https://www.cnblogs.com/leealvin/p/2358920.html
Copyright © 2011-2022 走看看