[英]how to concatenate two positive integers using macros?
我需要編寫一個程序來連接兩個正整數以使用宏形成另一個正整數。 例如,如果x=12
, y=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中可以看到,由於x
和y
具有已知值,因此編譯器為所有3種方法生成相同的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.