如何使用宏连接两个正整数?

时间:2019-05-05 04:26:16

标签: c macros

我需要编写一个程序以使用宏将两个正整数连接起来以形成另一个正整数。例如,如果x=12y=35和答案应为1235。我该怎么办?

4 个答案:

答案 0 :(得分:1)

您只需要使用##运算符

  

在扩展宏时将两个令牌合并为一个通常很有用。这称为令牌粘贴或令牌串联。 “ ##”预处理运算符执行令牌粘贴。展开宏后,每个“ ##”运算符两侧的两个标记合并为一个标记,然后替换宏扩展中的“ ##”和两个原始标记。通常,两者都将是标识符,或者一个将是标识符,而另一个将是预处理编号。粘贴后,它们将成为更长的标识符。这不是唯一有效的情况。也可以将两个数字(或一个数字和一个名称,例如1.5和e3)连接成一个数字。同样,可以通过令牌粘贴来形成多字符运算符(例如+ =)。

来自https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html

因此,在您的情况下,#define CONCAT_NUMBER(FIRST, SECOND) (FIRST ## SECOND)应该可以工作

答案 1 :(得分:0)

  

例如,如果x = 12,y = 35,答案应该是1235。我应该怎么做?

您需要将x左移一些小数位数,具体取决于y中的位数。那么y中的位数是多少?好吧,这是log(y)的整数部分。要完成转换,您需要将x乘以10升至该值。因此,根据您使用的语言,您需要的数学表达式是:

finalValue = x*(10^^(floor(log(y))) + y;

将其翻译成您选择的语言,您应该拥有想要的东西。

答案 2 :(得分:0)

如果您尝试将变量x和y传递给MACRO,则无法完成此操作。由于宏扩展发生在编译时。

如果您要将直接值传递给宏,则可以按以下步骤进行串联-

#define CONCATENATE(NUM_1, NUM_2) (NUM_1 ## NUM_2)

答案 3 :(得分:-1)

如果数字是整数文字,则可以使用简单的宏进行此操作。对于一般情况,您必须计算结果或使用非常繁琐的宏:

#include <stdio.h>

/* Simple token pasting macro, x and y must be literals */
#define CONCAT(x,y) x ## y

/* Elaborate macro: arguments are evaluated multiple times */
#define CONCAT1(x, y) ((y) + (x) * (\
                       (y) < 10 ? 10 :\
                       (y) < 100 ? 100 :\
                       (y) < 1000 ? 1000 :\
                       (y) < 10000 ? 10000 :\
                       (y) < 100000 ? 100000 :\
                       (y) < 1000000 ? 1000000 :\
                       (y) < 10000000 ? 10000000 :\
                       (y) < 100000000 ? 100000000 :\
                       1000000000))

int main() {
    int x = 12;
    int y = 35;
    int result;

    /* Solution with simple macro only for literals */
    result = CONCAT(12, 35);
    printf("%d\n", result);

    /* Solution with long macro */
    result = CONCAT1(x, y);
    printf("%d\n", result);

    /* Generic solution */
    result = x * 10;
    for (int i = y; i > 10; i /= 10)
        result *= 10;
    result += y;
    printf("%d\n", result);

    return 0;
}

输出:

1235
1235
1235

Godbolt's Compiler Explorer上可以看到,由于xy具有已知值,因此编译器会为所有3种方法生成相同的代码。