|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
[C] Valutazione condizioni
Buongiorno a tutti
Avrei un quesito: le istruzioni che io utilizzo come condizioni, per esempio per un if, vengono eseguite sempre tutte? Temo di essere stato criptico: ho un codice del genere: Codice:
if ((struct_1.index > -1) && (struct_2[struct_1.index].description != NULL)) {
doSomething();
}
) viene valutata?Se può servire, compilo con GCC Grazie
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6399
|
No, nel caso in esempio, essendoci un AND, se la prima condizione è falsa lo è anche l'AND, quindi la seconda non viene eseguita.
Non ricordo però se questo vale sempre o solo quando compili con ottimizzazioni ![]() Con un OR è diverso, devono essere valutate per forza di cose entrambe, con o senza ottimizzazioni. Quindi dipende sia dalla tabella di verità dell'operatore sia dalle ottimizzazioni Ultima modifica di Unrue : 22-01-2010 alle 18:44. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Quote:
Grazie per la risposta rapida Edit: infatti, ora vorrei capire se dipende dalle opzioni di ottimizzazione del compilatore... non vorrei avere un codice che si comporta in modo diverso in debug e in produzione... almeno, non più del solito
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6399
|
Quote:
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2782
|
Mi sembra che con OR se la prima espressione è vera la seconda non viene valutata.
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Quote:
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Che io sappia nel linguagio C gli operatori logici booleani && e || sono "corto-circuitati" sempre, nel senso che sono tali proprio a livello semantico, quindi le opzioni di ottimizzazione del compilatore non c'entrano: ma magari mi ricordo male, qualcuno può confermare?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
esatto, si chiama lazy OR e fa parte della specifica del linguaggio. esiste anche il lazy AND: se il primo operando dell'operatore && risulta nullo il secondo non viene valutato e l'espressione restituisce direttamente un valore nullo.
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6399
|
Quote:
Però secondo me in fase di debug non viene fatta, altrimenti per l'esempio postato prima, se nella seconda condizione ho un errore interno, lo salterei in quanto non viene valutata. |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12904
|
Quote:
Con l'AND se la prima NON è verificata non c'è bisogno di vedere la seconda espressione. Ovviamente sono arrivato in ritardo Ultima modifica di WarDuck : 22-01-2010 alle 18:56. |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6399
|
|
|
|
|
|
|
#12 | |||
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Si, confermo che in C, C++ e anche C# la valutazione degli operando && e || e' lazy.
Utile quindi nei confronti con NULL per i puntatori Quote:
Questo e' quindi anche un ottimo motivo per non inserire codice "attivo" nelle valutazioni. Es se qualcuno scrive qualcosa come segue, spezziamo le braccine Quote:
Da anche a maggior ragione bene a mente nei linguaggi come C# dove e' possibile scrivere del codice attivo anche in un semplice get di una proprieta', la cui lettura parrebbe quindi innocente, ma che potrebbe dare problemi analoghi come il precedente. E se invece scrivessi cosi', cosa accadrebbe? Quote:
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 23-01-2010 alle 23:49. |
|||
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
che le valuta entrambe perché l'AND é bitwise.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:31.










) viene valutata?










