Journal Code (très) laid

Posté par  .
Étiquettes : aucune
0
11
fév.
2005
Au secours, mon journal, j'ai été ensorcelé!

Aujourd'hui, j'ai eu (entre autres ;-) ) à coder un simple i=2i-1, sans passer par 2i (pour éviter un bête dépassement de registre, je manipule des ints que je sais positifs).

Et là, j'ai eu comme une torpeur... Et quand je me suis réveillé, l'écran m'affichait fièrement :

i+=--i,i++;

Ce doit être un lutin qui passait par là, et qui s'est emparé de mon clavier. Je ne vois pas d'autre explication, ça ne peut tout de même pas mes mains qui ont tapé ça sur les touches! (Quoi, qu'est-ce qu'il y a avec les pieds?)

Et vous, vous avez déjà eu affaire à ce genre de lutins farceurs?

Postez ici les affres qu'ils vous ont fait subir! Peut-être qu'en s'y mettant tous ensemble, nous parviendrons à les stopper!

S'il n'est pas déjà trop tard...
  • # Moi je vois pas le problème :)

    Posté par  . Évalué à 7.

    Salut,
    i=2*i-1;
    passerait je pense. En effet, le seul cas limite est le cas ou 2*i = 2^32 (en supposant que tu sois sur 32 bits), car sinon même 2i-1 sera en overflow.
    Donc si 2i=2^32, tu as 2i=0 donc i=0-1 = -1 (en signé) = 2^32-1 (en non signé).

    Mais j'ai ptet pas tout compris ;)
    • [^] # Re: Moi je vois pas le problème :)

      Posté par  . Évalué à 5.

      Et en plus, c'est vrai... Tu vois? Tu vois ce qu'ils me font subir pour pourrir mon code inutilement? Il faut lutter, vous dis-je!

      (Comment ça, il était déjà pourri?)
  • # c'est quoi ?

    Posté par  . Évalué à 5.

    heu... comme justement dis, j'etait en train de me emander de quelle limite tu parlais ? avec ton i*2 auquel tu enleve 1 :)
    ca me rassure, je vois que j'ai pas tout perdu a propos de cette question.

    mais par contre, il y a un truc que je ne comprends pas trop : pourquoi il y a une virgule .. j'avoue que je ne connais pas cette syntaxe ( a part dans un for peut être mais bon...) si tu pouvais m'expliquer ca m'aiderait, merci.
    • [^] # Re: c'est quoi ?

      Posté par  . Évalué à 5.

      Bon alors si je me rappelle bien, la virgule sert à enchaîner deux instructions qui sont évaluées de gauche à droite, et la valeur résultat est l'évaluation de l'instruction de droite.
  • # Regarde ce qui t'attend :

    Posté par  . Évalué à 9.

    Aïe aïe aïe ! Cà, ce sont les signes annonciateurs du syndrôme de l'IOCCC ! :-(
    En général, on commence par voir des petits lutins, et on finit comme çà :

    http://www0.us.ioccc.org/years.html#2004(...)

    Et, à ce que l'on dit, c'est incurable ...
    Mes condoléances ...
    • [^] # Re: Regarde ce qui t'attend :

      Posté par  . Évalué à 1.

      et après on commence à frénétiquement taper ça sur des dizaines de pages entières:

      all work and no play makes jack a dull boy
      all work and no play makes jack a dull boy
      all work and no play makes jack a dull boy all work and no play makes jack a dull boy 4ll work and no play makes jack a dull b0y all work and no play makes jack a null boy
  • # ce n'est ni sale ni laid ...

    Posté par  (site Web personnel) . Évalué à 4.

    dans notre culture, il y a un culte a l'immaculé, le pur, le blanc, ...

    mais ce n'est pas laid ce que tu as fait, il n'y a rien de mal. et c'est meme plutot bien, tu as eu un rapport charnel avec ton code, ce n'est pas sale.

    par contre prévois de mettre un zoli commentaire pour dire ce que cela fait genre i = 2*i-1 => i = (i-1)+(i-1)+1 => i+= --i, i++

    il y a 13 ans, j'ai eu une mauvaise surprise avec un bout de code super optimisé en C ... depuis, je colle des commentaires en C et des trucs que je suis sur de comprendre ( genre des explications et ses raisons ;) ).
  • # i += i--;

    Posté par  (site Web personnel) . Évalué à 4.

    est-ce que le code i += i--; ne ferait pas exactement la même chose tout en étant un petit peu plus compréhensible ? :p

    Sinon effectivement, c'est un joli morceau ;)
    • [^] # Re: i += i--;

      Posté par  (site Web personnel) . Évalué à 2.

      Et pourquoi pas tout simplement
      i+=i-1;
      ?
      • [^] # Re: i += i--;

        Posté par  . Évalué à 1.

        Ou encore i = i<<2 - 1; qui est plutôt lisible (mais ça fait moins gourou du C)
        • [^] # Re: i += i--;

          Posté par  (site Web personnel) . Évalué à 1.

          non ... il pourrait y avoir un overflow si i as ordinairement des valeurs limites par le haut ...
          je pense que

          i=(i-1)<<2 +1;

          est moins risque.
          • [^] # Re: i += i--;

            Posté par  . Évalué à 3.

            Et en fait, <<2 ça fait multiplié par 4, donc plutôt :
            i--;
            i<<=1;
            i++;

            Ou encore i=--i<<1,i++
    • [^] # Re: i += i--;

      Posté par  . Évalué à 2.

      est-ce que le code i += i--; ne ferait pas exactement la même chose tout en étant un petit peu plus compréhensible ? :p

      J'y ai pensé également mais l'auteur du journal a précisé qu'il ne voulait pas « passer par 2i ».
  • # Es-tu un geek?

    Posté par  (site Web personnel) . Évalué à 1.

    Ou comment faire compliqué alors qu'il y a plus simple.

    Ta formule est rigolote mais elle est rigoureusement identique à celle-ci :
    i = 2(i - 1) + 1

    En C en 1 ligne:
    i = 2 * (i - 1) + 1;

    C'est quand même plus lisible pour tous non? ;-)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.