PDA

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:

Andlea
23-06-2006, 10:43
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.

Andlea
23-06-2006, 11:23
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

;)

Bonfo
23-06-2006, 12:11
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:

Andlea
23-06-2006, 15:05
(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: