#define MIN(A,B) ((A) <= (B) ? (A) : (B))
c‘est la macro, on m’a demandé quel était l’effet secondaire si j’utilisais ce qui suit:
least = MIN(*p++, b);
Remarque: cette question était intégrée
Il évalue p++
deux fois. De plus, comme la première évaluation change p
, la deuxième fois, elle indiquera un élément différent . La valeur renvoyée sera donc *(initialp + 1)
ou b
.
Tu devrais essayer toi-même.
La macro va s’étendre à:
least = ((*p++)<=(b)?(*p++):(b))
vous aurez alors *p++
deux fois dans votre déclaration (c’est-à-dire qu’elle sera incrémentée deux fois).
*p++
est évalué deux fois lorsque la macro se développe en *p++ <= b ? *p++ : b
*p++ <= b ? *p++ : b
De plus, il n’existe pas de "C intégré".
Supposons l’adresse initiale de p = 0xfcf0, * p = 1, b = 2, valeur @ 0xfcf4 = 5 et valeur @ 0xfcf8 = 15
La macro se développera comme
moins = ((* p ++) <= (b)? (* p ++): (b));
c’est-à-dire le moins = ((1) <= (2)? (* p ++): (b));
puisque * p est incrémenté deux fois.
1) * p ++ -> maintenant p va pointer sur l’adresse 0xfcf4;
2) * p ++ -> maintenant p désignera l’adresse 0xfcf8;
Donc moins = 15; (les valeurs dans l’adresse 0xfcf8). J’espère que ça aide.