Question

HI,

Quelqu'un peut me aider à comprendre pourquoi la valeur de la place (x) est 49?

J'utilise Visual C ++ 6.0.

#define SQUARE(X) X * X

int main(int argc, char* argv[])
{
    int y = 5;

    printf("%d\n",SQUARE(++y));
    return 0;
}
Était-ce utile?

La solution

Neil Butterworth, Mark et Pavel ont raison.

SQUARE (++ y) se dilate à ++ ++ y * y, qui incrémente la valeur de y deux fois.

Un autre problème que vous pourriez rencontrer: SQUARE (a + b) se développe à a + b * a + b qui n'est pas (a + b) * (a + b) mais a + (b * a) + b. Vous devez prendre soin d'ajouter des parenthèses autour des éléments en cas de besoin, tout en définissant des macros: #define CARRE (X) ((X) * (X)) est un peu moins risqué. (Ian Kemp a écrit d'abord dans son commentaire)

Vous pouvez utiliser une fonction d'modèle en ligne (pas moins efficace lors de l'exécution) comme celui-ci:

template <class T>
inline T square(T value)
{
    return value*value;
}

Vous pouvez vérifier cela fonctionne:

int i = 2;
std::cout << square(++i) << " should be 9" << std::endl;
std::cout << square(++i) << " should be 16" << std::endl;

(pas besoin d'écrire

square<int>(++i)

parce que le type int est implicite pour i)

Autres conseils

Parce que la macro est à:

++y * ++y

ce qui donne un comportement non défini en C ++ - le résultat pourrait être quoi que ce soit. Ce problème très bien connu devrait être couvert dans un manuel décent qui couvre l'utilisation de macros. Lequel utilisez-vous?

Parce que les macros font substitution textuelle si le code que vous avez écrit s'étendu à

printf("%d\n",++y * ++y );

et l'ordre des opérations est un comportement non défini donc ce que le compilateur voit 2 incréments puis une multiplication

Alors faites attention avec des macros mieux d'utiliser les fonctions qui, comme le compilateur peut étendre en ligne ne prendra pas plus longtemps à courir.

En second lieu ne présumez pas ce qui se passera si vous incrémenter et utiliser des variables

Les macros ne sont pas des fonctions: ils modifient simplement le texte du programme. Cette opération est appelée Prétraitement et il est automatiquement exécuté avant que votre code soit compilé. Les gens écrivent des macros pour sauver leur temps et présenter une certaine variabilité à leur code source.

Lorsque vous écrivez SQUARE(x), aucun appel funciton réelle arrive, tout le texte est modifié. L'opération est tout à fait stupide, donc vous devez faire des précautions supplémentaires dans des cas comme le vôtre. Reportez-vous à d'autres réponses pour expliquer votre cas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top