代码之家  ›  专栏  ›  技术社区  ›  Sofia Zaiafarova

定义宏并使用数据类型查找绝对值

  •  0
  • Sofia Zaiafarova  · 技术社区  · 1 年前

    我正试图从课本的预处理器部分解决这个问题。

    这个问题要求定义一个宏ABSOLUTE(num)来计算某个数字或算术表达式的绝对值。

    我通过包括 <stdlib> 并定义一个函数 abs(num) :

    #include <stdio.h>
    #include <stdlib.h>
    #define ABSOLUTE(num) printf("The absolute value of %i is %i\n", (num), abs(num))
    
    int main()
    {
        ABSOLUTE(-1);
        ABSOLUTE(3-4);
        ABSOLUTE(7);
        ABSOLUTE(-8-3);
    
        return 0;
    }
    

    但在我尝试操作数据类型之前,因为图书部分正在对它们进行审查,而对图书馆只字未提。然而,它并没有起到明显的作用。

    #include <stdio.h>
    #define ABSOLUTE(num) printf("The absolute value of %i is %u\n", (num), (num))
    
    int main()
    {
        ABSOLUTE(-1);
        ABSOLUTE(3-4);
        ABSOLUTE(7);
        ABSOLUTE(-8-3);
    
        return 0;
    }
    

    我理解这里的错误,但想知道是否可以通过操纵数据类型或其他预处理器指令来解决这个问题。

    2 回复  |  直到 1 年前
        1
  •  2
  •   Eric Postpischil    1 年前

    要计算绝对值,只需在值为负数的情况下求反:

    #define ABSOLUTE(x) ((x) < 0 ? -(x) : (x))

    这将适用于一元的任何类型 - 定义了运算符(可能会溢出),这比使用要好 abs 自从 防抱死制动系统 要求 int .

        2
  •  0
  •   0___________    1 年前

    不要使用宏,因为你会进入灰色地带,而是使用函数。

    int ABSOLUTE(int x)
    {
        if(x == INT_MIN)
        {
            x = -1;
        }
        else if(x < 0) x = -x;
        
        return x;
    }
    
    void printABSOLUTE(int x)
    {
        int result = ABSOLUTE(x);
        if(result < 0)
        {
            printf("Integer overflow\n");
        }
        else printf("ABSOLUTE(%d) = %d\n", x, result);
    }
     
    int main()
    {
        printABSOLUTE(-1);
        printABSOLUTE(1);
        printABSOLUTE(0);
        printABSOLUTE(INT_MAX);
        printABSOLUTE(INT_MIN);
    }