Salut,
Comme cela a été dit par diogene, le problème est que dans ce cas tu n'auras pas de point de séquence entre l'évaluation de la condition et l'un des deux derniers opérandes. Sinon, l'instruction :
uint32_t mask = (uint32_t)(((int32_t) -expr) >> 31);
me semble inutilement complexe et à un comportement dépendant de l'implantation :
Envoyé par
C11 (n1570) § 6.5.7 al 5 p 95
The result of E1 >> E2 is E1 right-shifted E2 bit positions.
If E1 has an unsigned type or if E1 has a signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 / 2E2.
If E1 has a signed type and a negative value, the resulting value is implementation-defined.
Chez moi l'application de l'opérateur de décalage >> sur un nombre négatif n'a aucun effet. Étant donné que les types de tailles fixes comme uint32_t sont garantis d'être stocké en complément à deux, cette ligne peut être simplifiée en :
uint32_t mask = (uint32_t)-expr;
Aussi, cette technique fonctionne avec des expressions entières, mais quid de pointeurs, de nombres flottants, de nombres complexes, de structures ou unions ou encore d'expressions de type void comme celle-ci ?
(ptr != NULL) ? free(ptr) : (void)0;
Partager