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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.