Maison > Article > développement back-end > Pourquoi les zéros non significatifs dans les littéraux entiers C produisent-ils parfois des résultats inattendus ?
Clarifier les anomalies numériques en C : la signification des zéros non significatifs
Dans le domaine de la programmation C, le comportement des littéraux entiers contenant des zéros non significatifs peut parfois être déroutant. Examinons ce sujet curieux et éclairons ses mécanismes sous-jacents.
La norme C définit les littéraux entiers comme des séquences de chiffres sans virgule ni exposant. Préfixer le littéral avec 0 signifie un nombre octal (base 8), tandis que l'absence de préfixe indique un nombre décimal (base 10).
Cependant, considérez les extraits de code suivants :
int i = 07; // i == 7 int i = 16; // i == 16 int i = 00016; // i == 14, why? int i = 05016; // i == 2574, wow )
Dans le premier exemple, i est défini sur la valeur 7 car 07 est interprété comme une valeur octale (8 * 0 7 = 7). Ceci est cohérent avec la convention de C consistant à interpréter les zéros non significatifs sans préfixe comme des nombres octaux.
Cependant, dans les exemples suivants, les zéros non significatifs apparaissent avant les chiffres décimaux, ce qui soulève des questions. Selon la norme, ces littéraux ne doivent pas être acceptés comme nombres octaux. Alors, que se passe-t-il ici ?
La réponse réside dans une optimisation du compilateur connue sous le nom de « suppression octale ». Lorsque le compilateur rencontre un zéro non significatif suivi d'un chiffre décimal, il supprime l'interprétation octale et traite le littéral comme décimal à la place. Ceci explique pourquoi 00016 est évalué comme 14 et 05016 comme 2574.
D'un autre côté, 08 déclenche une erreur de compilation car il viole la règle de la norme selon laquelle les littéraux octaux ne peuvent pas contenir les chiffres 8 ou 9. Le compilateur attend un nombre octal valide, mais il trouve un caractère invalide et génère une erreur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!