Le respect des normes de programmation est une contrainte dans les langages informatiques. Certains programmes ne respectant pas ces normes peuvent avoir un comportement correct parfois mais incorrect dans d'autres cas.
Si on considère le cas du C la norme spécifie deux types de comportements suivant les violations envisagées :
Utiliser un comportement non spécifié dans un programme est possible si :
Évidemment dans ce cas le programme considéré ne sera pas portable dans d'autres environnements.
#includeint main(void) { int a = 0; printf("%d %d\n", a, ++a); return 0; }
L'ordre d'évaluation des paramètres lors d'un appel de fonction n'est pas spécifié dans la norme décrivant le langage C, aussi le compilateur peut évaluer ce fragment de code de plusieurs façons différentes. Par exemple :
int j = a; int k = j + 1; printf("%d %d\n", j, k);
affichera :
0 1
ou bien :
int j = a + 1; int k = j; printf("%d %d\n", j, k);
affichera :
1 1
int main(void) { double a; double * pa = &a; float * c; c = (float *)pa; return 0; }
La conversion entre deux pointeurs vers des types qui possèdent des conditions d'alignements potentiellement différents produit un résultat indéterminé en C.