2010-09-24 19 views
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; 
} 
+2

Est-ce ce devoir? – alex

+0

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) –

Répondre

8

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.

+2

... parce qu'il modifie un objet deux fois sans un point de séquence intermédiaire. '* f1 + = * f2 + = ...' serait également indéfini. – caf

+0

ainsi que '* f2 + = a + = ...' – AnT

-2

é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.

+1

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

+1

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

+0

Je réalise mes erreurs. Vous avez tout à fait raison - j'aurais dû lire votre message original plus attentivement. – Locklier