J'ai besoin d'écrire un programme pour joindre deux entiers positifs pour former un autre entier positif en utilisant des macros. Exemple, si x = 12
, y = 35
et que la réponse doit être 1235
. Comment dois-je faire cela?
4 Réponses :
Il vous suffit d'utiliser l'opérateur ##
Il est souvent utile de fusionner deux jetons en un tout en développant les macros. C'est ce qu'on appelle le collage de jetons ou la concaténation de jetons. L’opérateur de prétraitement ‘##’ effectue le collage de jetons. Lorsqu'une macro est développée, les deux jetons de chaque côté de chaque opérateur «##» sont combinés en un seul jeton, qui remplace alors le «##» et les deux jetons d'origine dans le développement de la macro. Généralement, les deux seront des identifiants, ou l'un sera un identifiant et l'autre un numéro de prétraitement. Lorsqu'ils sont collés, ils créent un identifiant plus long. Ce n’est pas le seul cas valable. Il est également possible de concaténer deux nombres (ou un nombre et un nom, tels que 1.5 et e3) en un nombre. En outre, les opérateurs à caractères multiples tels que + = peuvent être formés par collage de jetons.
Depuis https://gcc.gnu.org/onlinedocs/cpp/Concatenation. html
Donc, dans votre cas, #define CONCAT_NUMBER (FIRST, SECOND) (FIRST ## SECOND)
devrait fonctionner
@Caleb Cela fonctionne si les jetons sont connus au moment de la compilation, même pour les jetons numériques, testez-le onlinegdb.com/B1mhWK2s4 a>
Vous pouvez le faire avec une simple macro si les nombres sont des entiers littéraux. Pour le cas général, vous devez calculer le résultat ou utiliser une macro très lourde:
1235 1235 1235
Sortie:
#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; }
Comme on peut le voir sur Godbolt's Compiler Explorer , le compilateur génère le même code pour les 3 approches car x code > et
y
ont des valeurs connues.
Exemple, si x = 12, y = 35 et la réponse doit être 1235. Comment dois-je faire cela?
Vous devez décaler
x
vers la gauche d'un certain nombre de chiffres décimaux qui dépend du nombre de chiffres dansy
. Alors, quel est le nombre de chiffres dansy
? Eh bien, c'est la partie entière delog (y)
. Et pour accomplir le changement, vous devez multiplierx
par 10 pour atteindre cette valeur. Ainsi, l'expression mathématique dont vous avez besoin est, en fonction de la langue que vous utilisez, quelque chose comme:finalValue = x*(10^^(floor(log(y))) + y;Traduisez cela dans la langue de votre choix et vous devriez avoir ce que vous voulez.
Cela entraînera des pénalités d'exécution et / ou dépendra du compilateur pour en déduire qu'il ne change pas de valeur. Une solution macro-basée est plus efficace.
Si vous essayez de transmettre les variables x et y à la MACRO, cela ne peut pas être fait. Comme l'expansion des macros se produit au moment de la compilation.
Si vous souhaitez passer la valeur directe à la macro, la concaténation peut être effectuée comme suit-
#define CONCATENER (NUM_1, NUM_2) (NUM_1 ## NUM_2)
Vous n'aimez pas ma macro CONCAT1
?
J'ai exécuté et vérifié votre code. Cela fonctionne et donne le résultat attendu. La seule limitation est la taille.
Dans quelle langue ou dans quel environnement se trouvent ces macros?
J'utilise le langage C pour cela
@Aye: vous pouvez accepter l'une des réponses en cliquant sur la coche grise sous son score