Как объединить два натуральных числа с помощью макросов? - PullRequest
1 голос
/ 05 мая 2019

Мне нужно написать программу для соединения двух натуральных чисел, чтобы сформировать другое натуральное число, используя макросы.Например, если x=12, y=35 и ответ должен быть 1235.Как мне это сделать?

Ответы [ 4 ]

1 голос
/ 05 мая 2019

Вам просто нужно использовать оператор ##

Часто бывает полезно объединить два токена в один при расширении макросов. Это называется вставкой токена или конкатенацией токена. Оператор предварительной обработки ‘##’ выполняет вставку токена. Когда макрос раскрывается, два токена на каждой стороне каждого оператора «##» объединяются в один токен, который затем заменяет «##» и два исходных токена в расширении макроса. Обычно оба будут идентификаторами, или один будет идентификатором, а другой - номером предварительной обработки. При вставке они делают более длинный идентификатор. Это не единственный действительный случай. Также возможно объединить два числа (или число и имя, например, 1,5 и e3) в число. Кроме того, многосимвольные операторы, такие как + =, могут быть сформированы путем вставки токена.

С https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html

Итак, в вашем случае #define CONCAT_NUMBER(FIRST, SECOND) (FIRST ## SECOND) должно работать

0 голосов
/ 05 мая 2019

Если вы пытаетесь передать переменные x и y в MACRO, то это невозможно сделать. Как расширение макроса происходит во время компиляции.

Если вы хотите передать прямое значение в макрос, то конкатенация может быть выполнена следующим образом:

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

0 голосов
/ 05 мая 2019

Например, если x = 12, y = 35 и ответ должен быть 1235. Как мне это сделать?

Вам нужно сдвинуть x влево на некоторое числодесятичные цифры, которые зависят от количества цифр в y.Так каково количество цифр в y?Ну, это целая часть log(y).И чтобы выполнить сдвиг, вам нужно умножить x на 10, возведенное в это значение.Таким образом, математическое выражение, которое вам нужно, в зависимости от языка, который вы используете, выглядит примерно так:

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

Переведите это на свой язык, и вы должны иметь то, что хотите.

0 голосов
/ 05 мая 2019

Вы можете сделать это с помощью простого макроса, если числа являются целочисленными литералами.В общем случае вы должны вычислить результат или использовать очень громоздкий макрос:

#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

Как видно на Обозреватель компиляторов Годболта компилятор генерирует один и тот же код для всех трех подходов, поскольку x и y имеют известные значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...