Jump to content
Neo Force Order Resurrection
Dr_Windu

Tout Est Codable Ou Presque

Recommended Posts

Voui, ça m'étonne même pas T_T

 

ô Code, ô désespoir, ô effets de bord ennemis !

N'ai-je donc étudié que pour cet infamie ?

Et ne suis-je trempée dans multiples projets,

Que pour voir un jour tant de lignes codées ?

Mon ordi qu'avec respect j'entretiens,

Mon terminal, qui tant de fois compile,

Tant de fois lance GDB pour presqu'un rien,

Trahit donc mon esprit, rendu bien inutile ?

Ô cruels souvenirs de mes cours passés !

Ô TD de tant de jours, en un jour effacés !

Nouvelles lignes codées, fatales à mon bonheur !

Valeur de retour d'où tombe mon honneur !

 

(d'accord, je remet ma camisole et je vais faire la cuisine sans les mains)

Share this post


Link to post

int a = 7;
int b = 4;

a+=  (++a) + ((b++)--) - (--;

System.out.println("a="+ a + " b="+;

 

C'est du java, grosso modo : System.out.println(String) -> afficher le string dans la console.

 

Ca donne quoi d'après vous ? (sans tricher ^^)

 

EDIT RP : tenez pas compte du B (majuscule) c'est un b (minuscule)

 

Je vois bien un comportement indéfini ?

 

(Je fonctionne en C/C++ et je n'ai jamais touché au Java, mais je suppose que c'est à peu près identique à ce niveau.)

Share this post


Link to post

Perso, en général, j'essaye de coder proprement, j'ai donc pas ce genre de problèmes.

Share this post


Link to post

Nop Klore, Pour ceux qui veulent un indice :

 

Nop, en C/C++ comme en JAVA ici le piège est dans la distinction entre une valeur et une variable

 

Share this post


Link to post

Je dirais comme Klore, undefined behaviour. Je ne pense pas que l'ordre de traitement des effets de bord soit spécifié dans la norme, après il faudrait vérifier.

 

En particulier, je me souviens d'un effet rigolo qu'on avait découvert par hasard en C : l'ordre de traitement des varargs de "printf" est de droite à gauche. En gros :

 

int i = 0;
printf ("%i %i %i", ++i, ++i, ++i);

 

Affiche si je ne m'abuse le résultat : "3 2 1". Ou un truc du genre. (Faudrait tester, j'ai la flemme.)

 

 

PS : Oui, j'ai vu aussi le truc rigolo, que (x++) ne donne pas l'adresse mais la valeur de x, c'est ça ? Mais je persiste à penser qu'on est probablement en comportement indéfini.

Share this post


Link to post

Normalement ca ne doit pas compiler :P

Share this post


Link to post

Je dirais comme Klore, undefined behaviour. Je ne pense pas que l'ordre de traitement des effets de bord soit spécifié dans la norme, après il faudrait vérifier.

 

En particulier, je me souviens d'un effet rigolo qu'on avait découvert par hasard en C : l'ordre de traitement des varargs de "printf" est de droite à gauche. En gros :

 

int i = 0;
printf ("%i %i %i", ++i, ++i, ++i);

 

Affiche si je ne m'abuse le résultat : "3 2 1". Ou un truc du genre. (Faudrait tester, j'ai la flemme.)

 

 

PS : Oui, j'ai vu aussi le truc rigolo, que (x++) ne donne pas l'adresse mais la valeur de x, c'est ça ? Mais je persiste à penser qu'on est probablement en comportement indéfini.

 

T'es sûr que ton code compile ? Tu modifies la valeur de ta variable à plusieurs reprise dans ton appel de fonction. Etant donné qu'il n'y a pas de point de séquence à ce niveau, ton compilo ne peut pas te dire ce qui sera évalué en premier.

 

Aussi, le "problème" (qui n'est pas forcément un problème en soi) avec la fonction "printf", c'est qu'elle bufferise les données qu'on lui envoie. Elle flush les données lorsqu'elle rencontre une instruction lui indiquant une "newline" ou quand on le lui ordonne. Du coup, on peut avoir des comportements 'achement bizarres quand on ne fait pas attention à ce qu'on lui demande.

 

@RP : Tu parles de ton code Java ou de doc ? ^^ (Dans les deux cas, ça compile pas je pense XD)

Share this post


Link to post

Je dirais comme Klore, undefined behaviour. Je ne pense pas que l'ordre de traitement des effets de bord soit spécifié dans la norme, après il faudrait vérifier.

 

En particulier, je me souviens d'un effet rigolo qu'on avait découvert par hasard en C : l'ordre de traitement des varargs de "printf" est de droite à gauche. En gros :

 

int i = 0;
printf ("%i %i %i", ++i, ++i, ++i);

 

Affiche si je ne m'abuse le résultat : "3 2 1". Ou un truc du genre. (Faudrait tester, j'ai la flemme.)

 

 

PS : Oui, j'ai vu aussi le truc rigolo, que (x++) ne donne pas l'adresse mais la valeur de x, c'est ça ? Mais je persiste à penser qu'on est probablement en comportement indéfini.

 

Non, doc c'est totalement logique, Tu place tes arguments sur la pile en commençant par le dernier, ainsi en ASM, un printf("%d,%d",i,j) donnera un truc du genre:

push j
push i
push dword ptr <adresse_de_"%d,%d">
call printf

Donc forcément, ton code donnerais:

inc i
push i //3e argument
inc i
push i //2e
inc i
push i //1er
push dword ptr <adresse_de_"%d %d %d">
call printf

Comme quoi, même un "bête" cours sur les bases de l'asm, ca aide^^

Share this post


Link to post

@RP : Tu parles de ton code Java ou de doc ? ^^ (Dans les deux cas, ça compile pas je pense XD)

 

Du code de doc, mais sinon le mien ne compile pas non plus effectivement. Réponse :

5++ ca ne marche pas car c'est une valeur et non une variable, (b++)-- dans mon code, ca revient a décrémenter une valeur :)

Share this post


Link to post

le code de doc compile, a noter que je donne la traduction théorique de l'appel d'une fonction en assembleur. le compilateur GNU C que j'ai ici (code::blocks) n'est pas d'accord avec moi. (il me donne 3 3 3)

 

Ps: pour le code de RP, on se posais justement comme question en cours ce que des truc du genre "--i++" donnerais.

Share this post


Link to post

le code de doc compile, a noter que je donne la traduction théorique de l'appel d'une fonction en assembleur. le compilateur GNU C que j'ai ici (code::blocks) n'est pas d'accord avec moi. (il me donne 3 3 3)

 

Apparement, j'aurai parié que non pourtant :(

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×