Je n'ai vu personne mentionner le fait que même en mettant les définitions des macros entre parenthèses, le problème n'est pas complètement résolu.
La question a :
#define BIG_INTERVAL 60 * 60 * 1000
(et l'auteur de la question reconnaît que l'absence de parenthèses est un problème). Mais même avec :
#define BIG_INTERVAL (60 * 60 * 1000)
chacune des constantes (60, 60 et 1000) est bien représentable comme un int, mais le produit est 3600000, alors que le langage garantit seulement que INT_MAX >= 32767
.
Le langage dit que les constantes entières sont d'un type suffisamment grand pour contenir leurs valeurs (par exemple, 100000
peut être de type int
ou de type long int
selon les plages de ces types), mais il n'a pas de règle de ce type pour les expressions, même les expressions constantes.
Vous pouvez contourner ce problème de la manière suivante :
#define BIG_INTERVAL (60L * 60L * 1000L)
mais cela le rend de type long
même si ce n'est pas nécessaire.
Quant à la question de la préséance des opérateurs, voici mon exemple préféré :
#include <stdio.h>
#define SIX 1+5
#define NINE 8+1
int main(void)
{
printf("%d * %d = %d\n", SIX, NINE, SIX * NINE);
return 0;
}
Le résultat, bien sûr, est
6 * 9 = 42
(voir Douglas Adams).