簡體   English   中英

如何使用宏連接兩個正整數?

[英]how to concatenate two positive integers using macros?

我需要編寫一個程序來連接兩個正整數以使用宏形成另一個正整數。 例如,如果x=12y=35 ,答案應該是1235 我應該怎么做?

您只需要使用##運算符

在擴展宏時將兩個令牌合並為一個通常很有用。 這稱為令牌粘貼或令牌串聯。 “ ##”預處理運算符執行令牌粘貼。 擴展宏時,每個'##'運算符兩側的兩個標記合並為一個標記,然后替換宏擴展中的'##'和兩個原始標記。 通常,兩者都將是標識符,或者一個將是標識符,而另一個將是預處理編號。 粘貼后,它們將成為更長的標識符。 這不是唯一有效的情況。 也可以將兩個數字(或一個數字和一個名稱,例如1.5和e3)連接成一個數字。 同樣,可以通過令牌粘貼來形成多字符運算符(例如+ =)。

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

因此,在您的情況下,# #define CONCAT_NUMBER(FIRST, SECOND) (FIRST ## SECOND)應該可以工作

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

您需要將x向左移動一些小數位數,具體取決於y的位數。 那么y的位數是多少? 好吧,這是log(y)的整數部分。 為了完成轉換,您需要將x乘以該值的10。 因此,根據您使用的語言,您需要的數學表達式為:

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

將其翻譯成您選擇的語言,您應該擁有想要的東西。

如果您試圖將變量x和y傳遞給MACRO,則無法做到這一點。 由於宏擴展發生在編譯時。

如果您要將直接值傳遞給宏,則可以按以下方式進行串聯:

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

如果數字是整數文字,則可以使用一個簡單的宏來執行此操作。 對於一般情況,您必須計算結果或使用非常繁瑣的宏:

#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的Compiler Explorer中可以看到,由於xy具有已知值,因此編譯器為所有3種方法生成相同的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM