Newsgroup: it.comp.lang.c++
Titolo: Ciclo for: visibilita' variabili

Salve a tutti,
    avrei un dubbio sul funzionamento del ciclo for. Mi e' sempre stato
detto (mi pare di averlo letto anche su questo NG) che l'espressione:
    for (<espr1>; <espr2>; <espr3>)
    { istruzione; }
si traduce come:
    <espr1>;
    while (<espr2>)
    { istruzione;
      <espr3>; }
Un'eventuale variabile dichiarata in <espr1> risulterebbe definita fuori dal
corpo del ciclo for e quindi visibile nell'ambito dell'intero blocco
esterno... o almeno e' quello che ho sempre pensato, fino a quando non ho
visto il seguente codice compilare sotto il vecchio Turbo C++ 3.0 per DOS,
ma segnalarmi errore con il Borland C++ 5.5:
    void main()
    {    ...
        for (int i=0; i<5; i++)
        {    ...
        }
        ...
        int a=i;    // errore: undefined symbol 'i'
    }
E proprio non lo capisco, perche' seguendo pari pari il mio schema di
traduzione, ottengo un codice che compila perfettamente:
    void main()
    {    ...
        int i=0;
        while (i<5)
        {   ...
            i++;
        }
        ...
        int a=i;    // chiaro che stavolta funziona!
    }
Sapreste illuminarmi a riguardo? Qual e' lo lo schema di traduzione
corretto (= conforme allo standard) del for?
Ringrazio in anticipo chi mi avra' la pazienza di rispondermi e prometto che
mi faro' passare la cattiva abitudine di dichiarare variabili
nell'intestazione del for :)
--
Leo-Panda
email: 
leo-...@libero.it
ICQ#: 105550412

ICQ#: 105550412
Ciao
Marco Barisione (ICQ 84277092)

Non č che il tuo schema di traduzione del for *č* quello seguito dai
compilatori.
E' semplicemente un modo *equivalente* di scrivere un ciclo for con uno
while. Probabilmente il codice assembler prodotto dal compilatore sarą molto
simile al tuo codice ma questo non c'entra nulla con il C++
Lo standard indica che il campo di visibilitą per la variabile da te
definita č il blocco del ciclo for.
Al di fuori non č visibile.
Ovviamente alcuni vecchi compilatori non sono aggiornati allo standard.
--
----------
Lello Mele
Via San Sebastiano, 22
84036 Sala Consilina (SA)
P.Tel.:0347/643.35.25
HOMEPAGE:
http://www.lellomele.supereva.it
eMAIL:
v...@libero.it
me...@programmazione.it
-------------
"Esistono due modi per elaborare il progetto di un software.
 Il primo consiste nel renderlo semplice al punto tale che non
 manifesti lacune evidenti. Il secondo consiste nel renderlo
 complicato al punto tale che non manifesti lacune evidenti.
 Il primo metodo e' di gran lunga piu' difficile." [C.A.R. Hoare]


No, si traduce come:
    {
      <espr1>;
      while (<espr2>)
      { istruzione;
        <espr3>; }
    }
Luc.


No. 
Il codice for si traduce in :
    int main()
    {   ...
        {
          int i=0;
          while (i<5)
          {   ...
              i++;
          }
        } 
        ...
        int a=i;    // chiaro che stavolta funziona!
    }
e come vedi ha un ciclo "for" rappresentato con un corpo di
istruzioni.
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

"Luc" <TOGL...@katamail.com-TOGLI> wrote in message
news:fkceat41qjnn6h16v...@4ax.com...

a questo punto sarebbe piu' corretto dire:
  {
    <espr1>;
    while (<espr2>)
    {
      {
        istruzione;
      }
      <espr3>;
    }
  }
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

  }
Perche' ???


 Perche' ???
Le grafe esterne delimitano lifetime e visibility di variabili definite in
espr1, e questo credo sia chiaro.
La doppia "graffatura" interna al ciclo serve per delimitare lifetime e
visibility di variabili definite in istruzione.
Dubito che in espr3 (l'"incremento" del for) tu possa accedere a variabili
definite nel corpo del ciclo. E dubito anche che i side effect della distruzione
di queste debbano avvenire dopo la valutazione di espr3. Ergo le graffe extra
che rimettono le cose a posto.


visibility di variabili definite in istruzione.
Non sono d'accordo su questa rappresentazione di "istruzione".
Per istruzione si intende uno statement e a livello sintattico lo
statement e' definito :
statement
	: labeled_statement
	| compound_statement
	| expression_statement
	| selection_statement
	| iteration_statement
	| jump_statement
	;
e puo' quindi anche rappresentare un "compound_statement".


 ;
Io non intendevo affatto "rappresentare" lo statement. L'ho semplicemente
racchiuso fra graffe. Se lo statement espande a sua volta in un compound
statement allora avremo un ulterore paio di graffe.
Come dici tu statement PUO' essere compound. Ma non DEVE. Immaginati:
for ( Counter c=10; c; c-- )
    Life l;
Supponi che l'operator -- di Counter abbia un side effect (scrive su stdout
"--\n" oltre a decrementare) e che lo stesso valga per costruttore e distruttore
di Life (scrivono "born\n" e "dead\n").
eseguendo il ciclo ottieni:
born
dead
--
born
dead
--
etc. etc.
Se riscrivi:
  {
    Counter c=10;
    while ( c ) {
      Life l;
      c--;
    }
  }
ottieni:
born
--
dead
born
--
dead
etc. etc.
Per questo ho aggiunto le due graffe.
Altro esempio:
int foo()
{
    int j=0;
    for ( int i=0; i<5; i++, j++ )
        int j;
    return j;
}
Se riscrivi senza le graffe "extra" ...


Come dici tu statement PUO' essere compound. Ma non DEVE. Immaginati:
<snip>
Hai perfettamente ragione.
Perche' il while sia equivalente al for c'e' bisogno di un ulteriore
blocco di codice.  Non avevo mai pensato a questa possibilita'.  
Non si finisce mai di imparare ;)

 Non si finisce mai di imparare ;)
Non per nulla ci sono i NG ;-)


     }