Discuter:Exemples de code violant des normes

Un article de Wikipédia, l'encyclopédie libre.

Hormis le #include <stdio.h> manquant l'exemple donné est du C valide.

int main(){ int a=0; printf("%d+%d=1\n",a,!a); return 1; }

6.5.3.3 Unary arithmetic operators

[#5] The result of the logical negation operator ! is 0 if the value of its operand compares unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int. The expression !E is equivalent to (0==E).

une expression logique en C vaut soit zéro soit un, aucune autre valeur n'est possible, c'était déja vrai dans la définition original du C. L'auteur a probablement confondu avec un bug récurrent chez les débutants:

/* retourne zéro on success else non zero */ int f(void) { return 638; }

Avec une utilisation comme:

if (f() == 1) {...} au lieu du correct if (f()) {...}. méme dans ce cas le code est valide, sa sémantique est douteuse mais du point de vue du langage il n'y pas de comportement indéterminé.

Je referais un autre exemple basé sur printf("%d %d", a, ++a); ou le comportement est réellement indeterminé.

phe 12 mai 2004 à 00:54 (CEST)