Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294

    C++] increment unary op. Che che che??

    Non credo ai miei occhi.

    Dovevo fare qualche operazione in un ciclo e cercavo un modo intelligente di usare l'operatore ++.
    Siccome sono sempre dubbioso, mi sono detto, dai fai un esempio chiaro una volta per tutte cosi' finalmente capisci bene come funzionano le cose.
    Si certo, se non fosse che ...

    codice:
    #include <iostream>
    using namespace std;
    main ()
    {
       int i = 0;
       int j = 0;
    //#################################################
       cout << i << " " <<  i++ << " " << i << endl;
       cout << j << " " << ++j << " " << j << endl;
       cout << "Che che che?????\n";
    //#################################################
       i = 0; j = 0;
       cout << i << " "; cout << i++ << " "; cout << i << endl;
       cout << j << " "; cout << ++j << " "; cout << j << endl;
       cout << "Ora va gia' meglio..\n";
    }
    da' come risultato questo:
    codice:
    1 0 1
    1 1 1
    Che che che?????
    0 0 1
    0 1 1
    Ora va gia' meglio..
    Ma perche' mai???


    meglio che ci vado piano con gli incr...
    f
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

  2. #2
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294
    scusa, sono proprio ottuso, e'
    /code non \code
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

  3. #3
    Pansa allo stream di output come ad una LIFO

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Credo che la cosa dipenda da compilatore a compilatore.
    Sotto Windows (con Dev-Cpp) ottengo questo risultato:
    codice:
    0 0 1
    0 1 1
    Che che che?????
    0 0 1
    0 1 1
    Ora va gia' meglio..
    Mentre sotto Linux ottengo questo:
    codice:
    1 0 0
    1 1 0
    Che che che?????
    0 0 1
    0 1 1
    Ora va gia' meglio..
    Apparentemente sembrerebbe più corretto il risultato ottenuto sotto Windows, ma se si va a vedere la regola di valutazione delle espressioni risulta corretto il risultato Linux (quello che hai postato tu, io non lo ottengo...): le espressioni sono sempre valutate da destra a sinistra.

    Quindi la prima istruzione:
    codice:
       cout << i << " " <<  i++ << " " << i << endl;
    Viene valutata in questo ordine:
    codice:
       cout << i << " " <<  i++ << " " << i << endl;
       cout << i << " " <<  i++ << " " << 0 << endl;
       cout << i << " " <<  i++ << " " << 0 << endl;
       cout << i << " " <<  0 << " " << 0 << endl;
       cout << i << " " <<  0 << " " << 0 << endl;
       cout << 1 << " " <<  0 << " " << 0 << endl;
    Con il risultato seguente:
    codice:
    1 0 0
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Dal che si impara la lezione che è meglio evitare di abusare di questo genere di operatori.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Il presunto problema da te riscontrato è un NON problema: nel senso che è GIUSTO che il comportamento sia indefinito.
    Insomma il tuo è un classico errore da principianti, che purtroppo commettono anche molti presunti esperti.

    vedi:
    http://gcc.gnu.org/bugs.html#nonbugs_c
    codice:
    The following expressions have unpredictable results:
    
    x[i]=++i
    foo(i,++i)
    i*(++i)                 /* special case with foo=="operator*" */
    std::cout << i << ++i   /* foo(foo(std::cout,i),++i)          */
    since the i without increment can be evaluated before or after ++i.
    .

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.