13620

Soit une boucle
for[/pre] qui ne risque pas d'être exécutée :
[pre]int i = -1;
for (i = 0; i < -2; i++) {}
Est-ce que la valeur de i est garantie être -1 après la boucle, ou est-ce que ça pourrait être 0 suivant les implémentations ?

Zerosquare a été invité sur ce sujet.

Docteur norme C cheeky

13621

Zeph a été invité sur ce sujet.


Docteur norme yN grin
C'est normal qu'il n'y ait que la balise pre externe qui soit parsée ? cheeky

13622

La variable devrait toujours valoir 0 après cette boucle, pas -1. As-tu une implémentation concrète qui renvoie -1?
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

13623

Non. Je cherche juste un moyen (autre qu'avec un booléen créé pour l'occasion) d'être sûr que la boucle n'ait pas été exécutée une seule fois.

13624

Folco (./13620) :
Docteur norme C cheeky
Tu te trompes, c'est Nitro ça tongue

Le K&R ne le dit pas de manière très claire, mais pour moi, le résultat est forcément -1 (si i++ était exécuté inconditionnellement, il serait exécuté une fois de trop pour les boucles "classiques" aussi, or ce n'est pas le cas.) (mal lu)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

13625

./13621 : oula, ça risque d'être très chiant à corriger ça, je regarderai plus tard grin
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

13626

j'ai envie de dire que c'est specifique au compilo, et a la target (debug, release), et qu'il faudrait regarder l'asm genere?

Je pars du principe que ta for est vide, ce qui revient a for (...;...;...);, sinon evidemment oubliez ce que j'ai dit

13627

ps -> mon implémentation, dont je n'ai pas vérifié encore le comportement, est GCC 4.1.2 #sifflote# (mais bientôt GCC7 ##sifflotte_hyper_fort##)

edit -> Merci Zeph, désolé pour le report en plein thread ^^

Warpten -> ce qui m'intéresse, c'est de savoir si c'est normalisé ou pas, pas comment ça marche une fois dans un contexte donné ^^ Mais oui, les optims entre debug et release pourraient faire varier le comportement, en effet.

13628

Bon j'ai relu, je pensais qu'il y avait une ambiguïté, mais en fait non. Le -1 est bien garanti par la norme. (mal lu)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

13629

Zerosquare (./13624) :
Le K&R ne le dit pas de manière très claire, mais pour moi, le résultat est forcément -1 (si i++ était exécuté inconditionnellement, il serait exécuté une fois de trop pour les boucles "classiques" aussi, or ce n'est pas le cas.)
Autre exemple, parce que j'ai l'impression qu'il y a maldonne :
int i = -42;
for (i = 0; i < -2048; i++) {}
La question est plus de savoir si l'initialisation est exécutée, avant même qu'on parle d'incrémentation

13630

Donc mon exemple cross-posté renvoie bien -42 ? grin

13631

Ah pardon, j'avais mal lu. Ton second exemple renvoie 0. L'initialisation est toujours exécutée en premier, sinon un truc aussi bête que :
int i;
for (i = 0; i < 42; i++) 
{
    ...
}
serait indéfini.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

13632

C'est d'ailleurs pour cette raison qu'on appelle ça une initialisation cheeky

13633

Bon, et bien merci beaucoup pour cette information !

Faudra que je me renseigne précisément, mais j'imagine qu'une norme C n'existe pas en français, et est payante comme bien des normes ?

13634

Le K&R a été traduit très correctement en français (j'ai l'édition de chez Dunod), mais effectivement c'est pas gratuit.

Pour les normes ultérieures (C99, etc.), je ne sais pas s'il y a une traduction. Les textes définitifs sont payantes, mais les versions drafts (brouillons) sont gratuites, et généralement il n'y a quasiment pas de différences.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

13635

En effet i=0 doit etre executé, il est meme for probable que le compilateur si il n'y a aucun code entre

int i=42
for(i=0;...

la premiere assignation soit completement oublié

En fait dans le cadre d'un compilateur optimisant je m'attendrait qu'une telle fonction:


int bla(void) { int i=-42; for (i = 0; i < 42; i++) { } return i; }
soit remplacé par une simple:

int bla(void) { return 42; }
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

13636

Zeph (./13625) :
./13621 : oula, ça risque d'être très chiant à corriger ça, je regarderai plus tard grin
Mon observation est que [/pre] n'est reconnu en général que si suivi d'un retour à la ligne, sauf dans certains cas que je ne saurais décrire.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

13637

Zerosquare (./13634) :
Le K&R a été traduit très correctement en français (j'ai l'édition de chez Dunod), mais effectivement c'est pas gratuit.

Pour les normes ultérieures (C99, etc.), je ne sais pas s'il y a une traduction. Les textes définitifs sont payantes, mais les versions drafts (brouillons) sont gratuites, et généralement il n'y a quasiment pas de différences.
Pour la norme C99, il y a une version équivalente à la finale + les correctifs TC1, TC2 et TC3:
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
mais c'est en anglais.

Pour la norme C11, un document comme ça n'existe pas, il n'y a que le Final Committee Draft (FCD): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

13638

Je suppose que si tu pose la question c'est que tu as déjà eu le cas ou i valait -1?
J'aurais dit que i devait toujours être à 0.
avatar

13639

Bon ca a l'air d'etre 0 avec GCC et clang.

13640

https://godbolt.org/g/MmFN5W

pencil Godzil, mais apparemment GCC et Clang ne sont pas d'accord. Peut-etre en tripotant les flags?

[EDIT] Bon je suis un idiot, des -O1 l'assignation -1 est optimisee.

Marrant d'ailleurs, gcc sort mov eax, 0 et clang xor eax, eax

13641

Merci bien happy

Uther -> non, je n'ai aps eu de cas, mais je me demandais si je pouvais compter dessus de façon fiable.

edit -> Ouf, en rajoutant -O2, j'ai vu le code disparaitre au profit d'un xor, j'ai eu très peur grin

13642

Warpten: c'est un probleme d'optimisation, met du -Os ou -O2/3 tu verra les deux mettent xor eax, eax


Sinon pour mon code:

int bla(void) { int i=-42; for (i = 0; i < 42; i++) { } return i; }

Il fait bien un

mov eax, 42
reti

https://godbolt.org/g/E7AecR


Edit: holy shit, si on fait un appel a une fonction dans le for, clang deroule completement la boucle en -O3:

https://godbolt.org/g/58AcRP

eek
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

13643

Je pensais que c'etait en O1 par defaut sur godbolt grin

Mais pourquoi mov en -O1 et xor en -O2? Clairement j'xor direct personellement... Je suppose que les optimisateurs de gcc sont moins agressifs que ceux de clang?

13644

Warpten -> même question, ça serait intéressant de comprendre le pourquoi du comment, qui est certainement une question de détails bien sordides grin

13645

Godzil: wow, c'est agressif ca grin

13646

Il faut voir les flags que -O1 et -O2 active, mais le xor est notoirement plus rapide sur les x86 qu'un mov, j'imagine que la difference est que -O2 fait une passe plus aggressive en terme de vitesse que -O1 qui fait en taille. Apres il me semble que -Os utilise le xor..

Si tu regarde sur les autres archis, le x86 est la seule plateforme a utiliser le xor pour renvoyer 0
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

13647

Zeph a souhaité poursuivre une discussion dérivée dans un nouveau sujet. La discussion initiale a eu lieu dans le sujet topics/154076-yarotweet-ou-le-topic-des-pensees-a-la-con/455#post-13636 tandis que la discussion dérivée continue dans le sujet topics/187851-probleme-de-reconnaissance-de-pre où les messages en rapport ont été copiés.
avatar
Ben, bouh, quoi :D

13648

./13646: Oue mais xor eax, eax ca fait moins d'octets qu'un mov eax, 0, donc en plus d'etre plus rapide de xor, c'est mieux en taille... ^o)

'fin bref apres perso si j'ai besoin de faire de l'asm ce sera du inline a la main, le reste c'est du RE donc je m'en fous je regarde deja a du binaire

13649

Dans Assassin's Creed, l'Animus permet de revivre la mémoire de ses ancêtres par l'hypothèse que cette mémoire est transmise génétiquement de génération en génération.
Après réflexion, je me dis que ce serait souvent assez décevant en pratique. La plupart des gens de ce monde, et "les grands" en particulier, ont surtout eu des enfants jeunes et fait de grandes choses ensuite. On ne peut explorer la mémoire génétique d'un ancêtre que de sa naissance jusqu'à la naissance de son enfant (de son dernier enfant, dans le meilleur des cas). On découvre plus tard dans cette série la possibilité d'explorer les mémoires génétiques d'une autre personne, donc on n'est plus limité à notre propre ascendance, mais ça ne change pas vraiment le problème.
Quant à ceux qui n'auraient pas eu d'enfants ou dont la descendance jusqu'à nous a été interrompue, impossible de remonter jusqu'à eux.
avatar
« Nous avons propagé sur Extranet une histoire fabriquée de toutes pièces selon laquelle une certaine disposition d'étoiles, vue depuis la planète d'origine des butariens, formaient le visage d'une déesse galarienne.
Sans chercher à vérifier ces informations, certains ont décrété que c'était la preuve de l'existence de la déesse. Ceux qui notaient le manque de preuves se faisaient attaquer. »

Legion, geth trolleur à portée galactique

13650

Et alors? embarrassed
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.