|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 3923
|
[C] Domanda stupida sugli op. logici...
Ho una domanda niubbissima sugli operatori logici in C. Mi sono trovato di fronte questa stringa:
Codice:
int a, b; a=7; b=9; (a = b) && ((b > 3) || 5) E poi, dopo l'and, b>3 è vero ovviamente, ma poi un'espressione vera OR costante che cavolo restituisce??? Compilandolo in lcc mi dice che l'espressione è vera!
__________________
Intel Core i5 4690K by Cooler Master Hyper 412S | ASRock Z97 Extreme4 | G.Skill Ares 2x4GB DDR3 1600 | MSI nVidia GTX 260 55nm | Samsung SSD 840EVO 250GB | Cooler Master Stacker | Corsair RM650x
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 357
|
a = b è un'assegnazione, il confronto è ==
((b > 3) || 5) risulterà vera per tutti i valori di b > 3 Mettere in or una costante diversa da 0 significa verificare sempre l'espressione |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
forse si intendeva se b > 3 OR b > 5 (che comunque non ha molto senso logico) Per la precisione a = b è un'assegnazione E un confronto. Infatti se b é <> da 0 la condizione é vera altrimenti é falsa. if (a = 0) é valida (spesso il compilatore ti avverte) ma la condizione é falsa.
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 357
|
Quote:
probabilmente era un b>3 || b<5, supponendo che b non sia un intero, altrimenti bastava un ==4 boh |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 3923
|
Grazie per il supporto ragazzi. Quell'espressione è tratta da un tema d'esame, dovrebbe essere una domandina stupida da mezzo punto.
Infatti nemmeno io capivo quel || 5, evidentemente è una specie di trabocchetto. Anch'io ho pensato che una costante diversa da 0 equivale a un'espressione vera, però in tal caso i conti non tornano. Posto che (dato che il mio compilatore non fa storie) a=b equivale ad a==b (anche s enon è propriamente corretto). Allora l'espressione in oggetto si risolve così: a=b è falso ( b>3 è vero VERO || VERO = vero ) Falso && Vero = Falso Però compilando il codice Codice:
int main (void)
{int a, b;
a=7; b=9;
printf("%d \n", (a = b) && ((b > 3) || 5));
}
Dov'è l'inghippo? Sbaglierò sicuramente io....
__________________
Intel Core i5 4690K by Cooler Master Hyper 412S | ASRock Z97 Extreme4 | G.Skill Ares 2x4GB DDR3 1600 | MSI nVidia GTX 260 55nm | Samsung SSD 840EVO 250GB | Cooler Master Stacker | Corsair RM650x
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Penso che dire "a=b" equivalga a dire "assegna ad a il valore di b" e allo stesso tempo "9" e quindi una costante diversa da zero e quindi vera.
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
quindi la printf ti stampa 1 (vero) o 0 (falso) spacchiamola: (a = b) : assegna b(9) ad a e poi torna vero ((b > 3) || 5)) b é > 3 quindi vero. Poi c'e un || (OR) che ignoriamo perché abbiamo giá il vero di prima (e cmq || 5 é vero) quindi ci troviamo (vero && vero) => 1
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
|
Dico la mia.
In C VERO e FALSO non esistono. Da quel che sono il C controlla solo se il valore è 0 o non 0, che equivale a 1. Inoltre l'assegnamento ha come valore di ritorno il valore assegnato. Quindi un bel Codice:
return c=5; A questo punto mi verrebbe da dire che l'espressione diventa Codice:
(9) && ((b > 3) || 5) cioè VERO && (VERO || VERO ) cioè VERO && VERO cioè VERO cioè 1 |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 3923
|
Ora tutto è ok... a=b è un semplice assegnamento, non sapevo si potessero fare degli assegnamenti all'interno di un'espressione...
Grazie di nuovo a tutti. Mi siete stati d'aiuto (lunedì ho l'esame
__________________
Intel Core i5 4690K by Cooler Master Hyper 412S | ASRock Z97 Extreme4 | G.Skill Ares 2x4GB DDR3 1600 | MSI nVidia GTX 260 55nm | Samsung SSD 840EVO 250GB | Cooler Master Stacker | Corsair RM650x
|
|
|
|
|
|
#10 | ||
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
ed é anche il pericolo del C sei libero di fare di tutto il che si puó tradurre in catastrofe Quindi occhio Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
||
|
|
|
|
|
#11 | ||
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 3923
|
Quote:
Quote:
__________________
Intel Core i5 4690K by Cooler Master Hyper 412S | ASRock Z97 Extreme4 | G.Skill Ares 2x4GB DDR3 1600 | MSI nVidia GTX 260 55nm | Samsung SSD 840EVO 250GB | Cooler Master Stacker | Corsair RM650x
|
||
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 357
|
Quote:
ti invidio però, ho tecniche avanzate di grafica comp., devo esporre un seminario e portare 8 progetti opengl |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:17.



















