|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Apr 2006
Messaggi: 59
|
[Linguaggio C] getc
Ciao a tutti ho il seguente dubbio:
Supponiamo che io ho: if((c = getc(ptr->file)) == '#'){ ... ... codice vario ... ... } else if((c = getc(ptr->file)) == '*'){ ... ... codice vario ... ... } Ora io mi chiedo la getc del secondo if non legge lo stesso carattere del primo if giusto? Ma legge il successivo, è corretto? Per fargli leggere lo stesso caratte dovrei mettere una ungetc prima del secondo if ... ditemi se sbaglio!! |
|
|
|
|
|
#2 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
La soluzione migliore è 1 sola lettura e poi la catena di if (o uno switch, per es.). c = getc (....); if (c == .....) { ... } else if (c == .....) { ... } .....
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Apr 2006
Messaggi: 59
|
Grazie del chiarimento ... faro proprio come dici te!!
Ciaooo |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Apr 2006
Messaggi: 59
|
Supponiamo che abbia un ciclo while così fatto:
while((c = getc(ptr->file)) != '#' || (c = getc(ptr->file)) != '*'){ ... ... codice ... ... } La getc viene ripetuta due volte anche in questo caso anche se c'è un OR giusto? So che è molto simile all'esempio precedente, ma voglio essere solo sicuro. Anche in questo caso dovrei fare prima una letteura con getc e poi confrontare il carattere letto. Ciao |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1453
|
Non viene ripetuta due volte, l'or è vero anche se solo una delle due è condizioni è vera.
Se nel caso la prima fosse vera, il compilatore non si preoccupa di controllare che sia vera anche la seconda, ma esegue direttamente il blocco del codice.
__________________
Ciao ~ZeRO sTrEsS~ |
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Apr 2006
Messaggi: 59
|
ok ...
ma se invece è vera la seconda la prima l'ha pur sempre letta ... o no? |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
La OR || ha il comportamento "short-circuit". In A || B se A è vero allora B non viene valutato. Se A è falso allora B viene valutato.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Se però A è falso allora viene valutato anche B il che provoca 2 letture da file e non una.
La soluzione potrebbe essere: Codice:
while((c = getc(fptr)) != '#' || c != '*') {
...
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:18.




















