Question

Pourquoi la pièce suivante de 12 12 12 d'impression de code C

int main(int argc, char const *argv[]) {
  int a = 2, *f1, *f2;
  f1 = f2 = &a;
  *f2 += *f2 += a += 2.5;
  printf("%i %i %i\n", a, *f1, *f2);
  return 0;
}
Était-ce utile?

La solution

*f2 += *f2 += a += 2.5;

Cette ligne a Undefined Comportement parce que vous modifiez la valeur de *f2 (c.-à-a) plus une fois dans la même expression sans point d'séquence intermédiaire. UB moyens que votre programme peut imprimer « Bonjour tout le monde », il peut se bloquer, il peut imprimer 12 12 12 ou 12 12 1029 ou il peut commencer à manger votre cerveau. Ne comptez pas sur le comportement non défini.

Pour citer la norme C ++ (je sais que la question est étiqueté C, mais je n'ai pas une norme C par moi et je sais que la même règle est en C)

Sauf indication contraire, l'ordre d'évaluation des opérandes des opérateurs individuels et subexpressions individuels expressions, et l'ordre dans lequel les effets secondaires ont lieu, est unspecified.53) entre la précédente et suivant le point de séquence scalaire d'un objet doit avoir sa valeur stockée modifiée au plus une fois par l'évaluation d'une expression. En outre, la valeur préalable est accessible uniquement pour déterminer la valeur à stocker. Les prescriptions du présent paragraphe doivent être respectées pour chaque commande admissible des sous-expressions d'une pleine expression; sinon le comportement est non défini .

Autres conseils

Il imprime la même valeur pour tous parce que vous pointez à une seule variable int:. a

Il imprime 12 parce a + 2.5 = 4 (a est un int), puis vous l'ajoutez à lui-même deux fois.


@Downvoters: Pourquoi si négatif? Je pense que ma réponse dit que ce compilateur est en train de faire sur ce code exemple , ce qui devrait aider l'OP comprendre le comportement. Je suis d'accord que Armen Tsirunyan 's réponse est bonne (c.-à-devrait obtenir la tique) et que le behaviour est non défini selon la norme . Mais les normes sont mises en œuvre, et je l'ai encore vu un compilateur qui compile le code, puis, lors de l'exécution, jette soudainement ses mains et dit Undefined behaviour!.

I parce *f2 et le point de *f1 à a (un entier).

*f2 = &a = 2 et *f1 = &a = 2

À ce stade, vous ajoutez à une valeur de 2.5 (parce a est un entier, vous obtiendrez 4).

Que vous avez

a = 4
f2 = 4
f1 = 4

À ce stade, vous faites f2+f1+a = 12.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top