PDA

View Full Version : [C] Domanda stupida sugli op. logici...


riva.dani
23-06-2006, 11: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, 11: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, 12: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, 12: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, 12: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, 12: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, 13: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, 13: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, 14: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, 14: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, 15: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, 16: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:

Hardware Upgrade Forum Database Error
Database Error Database error
The Hardware Upgrade Forum database has encountered a problem.

Please try the following:
  • Load the page again by clicking the Refresh button in your web browser.
  • Open the www.hwupgrade.it home page, then try to open another page.
  • Click the Back button to try another link.
The www.hwupgrade.it forum technical staff have been notified of the error, though you may contact them if the problem persists.
 
We apologise for any inconvenience.