Diamo una macro per calcolare il massimo di due valori:
#define MAX(a, b) ((a) < (b) ? (a) : (b))
Poi usiamo in questo modo:
int x = 5;
int y = 10;
int max = MAX(x++, y++);
Poi la macro viene espansa per
int max = ((x++) < (y++) ? (x++) : (y++));
Come si può vedere, l'operazione di incremento su x
o y
avverrà due volte, non cosa succederebbe se avessi una funzione in cui ogni argomento che passi viene valutato solo una volta.
Un altro punto importante è l'uso di parentesi nella macro. Prendiamo un altro semplice macro:
#define MUL(a, b) a * b
Ora, se si richiama la macro come
int sum = MUL(x + 3, y - 2);
quindi l'espansione diventa
int sum = x + 3 * y - 2;
Quale causa operator precedence è pari a
int sum = x + (3 * y) - 2;
Spesso non proprio quello che ci si aspettava, se ci si aspetta (x + 3) * (y - 2)
.
Questo problema viene anche "risolto" utilizzando le funzioni.
fonte
2016-03-14 16:36:11
Schildt è [visto scettico da alcuni] (https://en.wikipedia.org/wiki/Herbert_Schildt#Reception). Basta dire. – DevSolar
@DevSolar: Non conosco quel libro, ma se l'affermazione citata è tipica dello stile, sono pienamente d'accordo con gli scettici. – Olaf
@DevSolar Volevi dire [scettico] (https://www.google.com/search?q=define%3Askeptical), giusto? Oppure lo hai scritto con una [C] (https://en.wikipedia.org/wiki/C_ (programming_language)) perché questa domanda è codificata [tag: c] e non [tag: k]? : P – cat