Понимание директив препроцессора в этом случае? - PullRequest
0 голосов
/ 08 февраля 2011
#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);
}

Что такое выход и почему?

Ответы [ 2 ]

6 голосов
/ 08 февраля 2011

Лучше переписать свой макрос так:

#define swap(a, b, type) \
        do { \
                type t = a; \
                a = b; \
                b = t; \
        } while (0)
2 голосов
/ 08 февраля 2011

На основании использования и того факта, что c не используется в макросе, похоже, что в макросе есть опечатка.Вместо использования int следует сказать c:

#define swap(a,b,c)(c t;t=a;a=b;b=t;);

На самом деле, хотя это «исправление» даст вам общее представление о макросе, оно не будет компилироваться.Пожалуйста, см. ответ Пеймана , в котором рассказывается, как его правильно написать.

По сути, это похоже на способ обмена двумя переменными a, b типа c.

В вашем случае вывод будет:

20 10

Способ работы этого алгоритма обмена прост.По сути, вы хотите скопировать a в b и b в a.Однако, если вы просто скопируете b в a, вы потеряете a, и вы застрянете с двумя копиями b.

вместо простого копирования b вa, вы сначала сохраняете копию a во временную переменную , называемую t, затем копируете b в a, затем копируете t (которая содержит исходное значениеa) в b.Когда вы закончите, вы можете забыть о t.

...