View Full Version : [C] Domanda stupida sugli op. logici...
riva.dani
23-06-2006, 10:29
Ho una domanda niubbissima sugli operatori logici in C. Mi sono trovato di fronte questa stringa:
int a, b;
a=7; b=9;
(a = b) && ((b > 3) || 5)
La prima cosa che non capisco è se a=b equivale a scrivere a==b... :mbe:
E poi, dopo l'and, b>3 è vero ovviamente, ma poi un'espressione vera OR costante che cavolo restituisce??? :confused:
Compilandolo in lcc mi dice che l'espressione è vera! :help:
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
trallallero
23-06-2006, 11:01
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
e che senso ha ((b > 3) || 5) ??? mai vista. A 'sto punto ((b > 3) || 1), perché 5 ?
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.
e che senso ha ((b > 3) || 5) ??? mai vista. A 'sto punto ((b > 3) || 1), perché 5 ?
forse si intendeva se b > 3 OR b > 5 (che comunque non ha molto senso logico)
si infatti non capisco quel || 5
probabilmente era un b>3 || b<5, supponendo che b non sia un intero, altrimenti bastava un ==4
boh
riva.dani
23-06-2006, 11:41
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
int main (void)
{int a, b;
a=7; b=9;
printf("%d \n", (a = b) && ((b > 3) || 5));
}
viene stampato un bell'1... :mbe:
Dov'è l'inghippo? Sbaglierò sicuramente io.... :muro:
wingman87
23-06-2006, 11:59
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.
trallallero
23-06-2006, 12:05
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
int main (void)
{int a, b;
a=7; b=9;
printf("%d \n", (a = b) && ((b > 3) || 5));
}
viene stampato un bell'1... :mbe:
Dov'è l'inghippo? Sbaglierò sicuramente io.... :muro:
una istruzione del genere é booleana, cioé vero/falso
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
;)
Dico la mia. :D
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
return c=5;
oltre ad assegnare a c il valore 5, ritorna il valore 5. (O almeno così mi hanno insegnato all'esame di linguaggi ;) )
A questo punto mi verrebbe da dire che l'espressione diventa
(9) && ((b > 3) || 5)
cioè
VERO && (VERO || VERO )
cioè
VERO && VERO
cioè
VERO
cioè
1
Mi sembra tornare :D :D
riva.dani
23-06-2006, 13:31
Ora tutto è ok... a=b è un semplice assegnamento, non sapevo si potessero fare degli assegnamenti all'interno di un'espressione... :D
Grazie di nuovo a tutti. Mi siete stati d'aiuto (lunedì ho l'esame :eek: )...
trallallero
23-06-2006, 13:48
Ora tutto è ok... a=b è un semplice assegnamento, non sapevo si potessero fare degli assegnamenti all'interno di un'espressione... :D
questo é il bello del C ;)
ed é anche il pericolo del C :eek:
sei libero di fare di tutto il che si puó tradurre in catastrofe :D
Quindi occhio ;)
Grazie di nuovo a tutti. Mi siete stati d'aiuto (lunedì ho l'esame :eek: )...
in bocca al lupo :)
riva.dani
23-06-2006, 14:37
questo é il bello del C ;)
ed é anche il pericolo del C :eek:
sei libero di fare di tutto il che si puó tradurre in catastrofe :D
Quindi occhio ;)
Infatti ora capisco cosa intendesse il mio prof. quando diceva cose del genere... :D
in bocca al lupo :)
Crepi!!! :sperem:
(lunedì ho l'esame :eek: )...
anche io ;)
ti invidio però, ho tecniche avanzate di grafica comp., devo esporre un seminario e portare 8 progetti opengl :sofico:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.