Le programme donné est-il bien défini?Confusion dans le programme C
#include <stdio.h>
int main()
{
int a=2,*f1,*f2;
f1=f2=&a;
*f2+=*f2+=a+=2.5;
*f1+=*f1+=a+=2.5;
printf("\n%d %d %d\n",a,*f1,*f2);
return 0;
}
Le programme donné est-il bien défini?Confusion dans le programme C
#include <stdio.h>
int main()
{
int a=2,*f1,*f2;
f1=f2=&a;
*f2+=*f2+=a+=2.5;
*f1+=*f1+=a+=2.5;
printf("\n%d %d %d\n",a,*f1,*f2);
return 0;
}
Non Le bit avec *f2 += *f2 += ...
est déjà un comportement non défini. Modifications multiples du même objet sans point de séquence intermédiaire. Pas besoin de regarder plus loin.
éditer - J'avais totalement tort quand j'ai dit que l'ordre des opérations de contrôle des parenthèses. AndreyT avait raison de me corriger. Le code d'origine que j'ai posté avait également un comportement indéfini. C'est mon 2ème essai. Mon post original est également ci-dessous celui-ci de sorte que les corrections peuvent être vus.
C'est une bonne pratique de codage de diviser vos déclarations de variables en plusieurs lignes afin que vous puissiez voir ce qui se passe.
// Ce code est une expérience avec des pointeurs
#include<stdio.h>
int main()
{
int a=2; //initialize a to 2
int *f1;
int *f2;
f1 = &a; //f1 points to a
f2 = &a; //f2 points to a
a += 2.5;
*f1 += a;
*f1 += a;
*f2 += a;
*f2 += a;
printf("\n%d %d %d\n",a,*f1,*f2);
return 0;
}
impressions résultat 64 64 64
// Mon précédent code incorrect est ci-dessous:
#include
int main()
{
int a=2; //initialize a to 2
int *f1;
int *f2;
f1 = &a; //f1 points to a
f2 = &a; //f2 points to a
a += 2.5; //2.5 + 2 = 4.5, but 4.5 as an int is 4.
*f1 += (*f1 += a); //4 + 4 = 8. 8 + 8 = 16.
*f2 += (*f2 += a); //16 + 16 = 32. 32 + 32 = 64.
printf("\n%d %d %d\n",a,*f1,*f2);
return 0;
}
reproductions de tableaux 64 64 64
Vous devez utiliser les parenthèses pour garantir quelles opérations se produisent en premier. J'espère que cela t'aides. d'abord. J'espère que cela t'aides.
Vraiment? Pourquoi alors imprime-t-il 72 72 72 quand je lance le code original? :) Réponse: le programme n'a aucune sortie spécifique ou prévisible. Le comportement de ce programme est * undefined *. Le programme est cassé (cela s'applique au code original ainsi qu'à votre version). – AnT
En plus de cela, les parenthèses en C ne donnent aucune garantie quant à l'opération qui se produira en premier. Les parenthèses affectent le regroupement d'opérandes et d'opérateurs, pas l'ordre d'évaluation. – AnT
Je réalise mes erreurs. Vous avez tout à fait raison - j'aurais dû lire votre message original plus attentivement. – Locklier
Est-ce ce devoir? – alex
duplication possible de [Quelqu'un pourrait-il expliquer ces comportements indéfinis (i = i + + + ++ i, i = i + +, etc ...)] (http://stackoverflow.com/questions/949433/could-anyone-explain-these -undefined-behaviors-iiiii-etc) –