PDA

View Full Version : [C] If senza operatori relazionali : come viene valutato ?


Ragazzo triste
26-09-2009, 14:00
Salve a tutti

vorrei capire l'esatto significato di espressioni come questa :

if (x%4/2) b=1;else b=0;

con x che varia da 0 a 7 in base ad un ciclo for che ometto.

Mi interessa cioè capire il reale significato della condizione dell'if : quando non ci sono operatori relazionali come < o >,la parentesi tonda che contiene la condizione dell'if,come viene valutata ?

E' come se io scrivessi "se (x%4/2) è vera,cioè il risultato di questa espressione diverso da zero" ?

Oppure ha un significato diverso ?

Spero in una vostra veloce risposta ;)

agente mm8
26-09-2009, 14:59
Se il risultato della divisione tra x e 4/2 è vero (cioè non è zero), allora b è uguale a 1, altrimenti b diventa uguale a 0.

_Claudio
26-09-2009, 15:09
Stai lavorando con logaritmi discreti o simili?

Comunque quell'espressione ha poco senso perchè x è in modulo 8:

x=0; x%4/2=0 if falso=>b=0
x=1; x%4/2=0,5 if vero=>b=1
x=2; x%4/2=1 if vero=>b=1
x=3; x%4/2=1,5 if vero=>b=1
x=4; x%4/2=0 if falso => b = 0
x=5; x%4/2=0,5 if vero=>b=1
x=6; x%4/2=1 if vero=>b=1
x=7; x%4/2=1,5 if vero=>b=1

Il che è equivalente a fare:
if(x == 0 || x == 4) b = 0;
else b = 1;

oppure

b= x == 0 || x == 4 ? 0 : 1;

Istruzioni che computazionalmente sono decisamente più leggere, fermo restando che il modulo di x sia fisso.

Ragazzo triste
26-09-2009, 16:01
Stai lavorando con logaritmi discreti o simili?

Comunque quell'espressione ha poco senso perchè x è in modulo 8:

x=0; x%4/2=0 if falso=>b=0
x=1; x%4/2=0,5 if vero=>b=1
x=2; x%4/2=1 if vero=>b=1
x=3; x%4/2=1,5 if vero=>b=1
x=4; x%4/2=0 if falso => b = 0
x=5; x%4/2=0,5 if vero=>b=1
x=6; x%4/2=1 if vero=>b=1
x=7; x%4/2=1,5 if vero=>b=1

Il che è equivalente a fare:
if(x == 0 || x == 4) b = 0;
else b = 1;

oppure

b= x == 0 || x == 4 ? 0 : 1;

Istruzioni che computazionalmente sono decisamente più leggere, fermo restando che il modulo di x sia fisso.
Sto svolgendo un esercizio in cui si chiede di determinare cosa stampa a video il seguente programma :

#include <stdio.h>
#include <stdlib.h>
#define COUNT 4

main(){
int a=0,b=0,c=0,x=0;
for (x=0;x<8;x++) {
if (x<COUNT) a=0;else a=1;
if (x%COUNT/2) b=1;else b=0;
printf("%2d%2d%2d%4d\n",a,b,c,!b&(c|(a&!c)) );
c=!c;
}


system("PAUSE");
}

...ovviamente senza l'uso del pc e di nessun IDE.

Bisogna quindi fare la tabella di verità per le variabili a,b,c,x e per l'espressione composita con gli operatori bitwise all'interno della printf.

Ciò che non capisco è: nella tabella di verità che tu hai fatto per l'if,l'operatore modulo non dovrebbe operare prima della divisione / ?
L'associatività è da sinistra verso destra...

Insomma,in poche parole,quando ad esempio scrivi :

x=1; x%4/2=0,5 if vero=>b=1

non dovrebbe essere :

x=1; x%4=1%4=4 (il resto è 4)
...e poi 4/2=2 quindi if vero e b=1

?

_Claudio
26-09-2009, 18:58
Giustamente, se è un esercizietto capisco che non sia ottimizzato, pensavo stavi leggendo e migliorando del codice. Errore mio.

Dunque 1:4=0,25. Dividendo l'unità in 4 parti (fai un'operazione modulo 4) lo 0,25 corrisponde ad 1/4 pertanto il resto della divisione è 1.

Così come 2:4=0,5 che sono 2/4 di unità e il resto è 2.

In sostanza quando lavori col resto della divisione devi lavorare coi numeri in modulo come si fa alle elementari piuttosto che lavorare con i numeri in Q o R es. 35/6 alle elementari si scrive come:
35:6 = 5 col resto di 5 perchè 35/6=5,83 ma 0,83periodico (il resto) corrisponde a 5/6 pertanto il modulo è 5.

Spero di essere stato abbastanza chiaro, la questione è più facile di come l'ho illustrata io (che mi spiego pessimamente), e sarà ancora più facile se nel tuo percorso di studi avrai la fortuna (perchè di fortuna si tratta) di affrontare la logica, le strutture algebriche e i giochetti con l'aritmetica modulare.

L'associatività è a sinistra e comunque se mi ricordo bene % ha precedenza maggiore rispetto a /.

||ElChE||88
26-09-2009, 19:02
e comunque se mi ricordo bene % ha precedenza maggiore rispetto a /.
No, stesso livello.

_Claudio
27-09-2009, 00:35
No, stesso livello.

Vero, sì, ricordavo male.