#define swap(a,b,c)(int t;t=a;a=b;b=t;);
void main()
{
int x=10,y=20;
swap (x,y,int);
printf("%d %d\n",x,y);
}
Quelle est la sortie et pourquoi?Comprendre les directives du préprocesseur dans ce cas?
#define swap(a,b,c)(int t;t=a;a=b;b=t;);
void main()
{
int x=10,y=20;
swap (x,y,int);
printf("%d %d\n",x,y);
}
Quelle est la sortie et pourquoi?Comprendre les directives du préprocesseur dans ce cas?
Basé sur l'utilisation et sur le fait que c
n'est pas utilisé dans la macro, il semble qu'il y ait une faute de frappe dans la macro. Au lieu d'utiliser int
, il faut dire c
:
#define swap(a,b,c)(c t;t=a;a=b;b=t;);
En fait, alors que cette « fixer » vous donnera l'idée générale de la macro, il ne sera pas compiler. S'il vous plaît voir Peyman's answer qui vous dit comment l'écrire correctement. Fondamentalement, il ressemble à un moyen d'échanger deux variables a
, b
du type c
.
Dans votre cas, la sortie serait:
20 10
La façon dont cet algorithme fonctionne swapping est simple. Fondamentalement, vous voulez copier a
en b
et b
en a
. Cependant, si vous copiez simplement b
dans a
, vous perdrez a
, et vous serez coincé avec deux copies de b
.
Au lieu de simplement copier b
dans a
, vous devez d'abord enregistrer une copie de a
dans une variable temporaire appelé t
, puis copiez b
dans a
, puis copiez t
(qui détient la valeur originale de a
) dans b
. Lorsque vous avez terminé, vous pouvez oublier t
.
Vous ne pouvez pas mettre des instructions entre parenthèses ou déclarer des variables dans des expressions. La macro a besoin d'un peu plus de travail. –
@Chris: bien sûr, vous avez absolument raison. Je vais mettre une référence à votre réponse dans la mienne. Tandis que votre réponse explique comment le compiler, le mien donne un peu plus d'aperçu de comment cela fonctionne. –
@Chris: évidemment, je veux dire Peyman, pas le vôtre, puisque vous n'avez pas répondu à la question. –
Mieux vaut réécrire votre macro comme ceci:
#define swap(a, b, type) \
do { \
type t = a; \
a = b; \
b = t; \
} while (0)
Pas "mieux", _necessary_. La macro OP ne devrait pas compiler. –
Où puis utilisez 'C' dans votre macro? – Peyman
Votre code ne compile pas et votre question n'est pas claire. –