Sto cercando come si fa a controllare con un solo IF, due variabili.
Ma non trovo nulla.
Era per non fare due IF e mantenere il codice piu' possibile pulito.
Sto cercando come si fa a controllare con un solo IF, due variabili.
Ma non trovo nulla.
Era per non fare due IF e mantenere il codice piu' possibile pulito.
acik:
Sto cercando come si fa a controllare con un solo IF, due variabili.
Ma non trovo nulla.
per la AND if (A==0 && B==1) per la OR if(A==0 || B==1)
Grazie.
Mi sai indicare uina guida per la IDE ?
QUI (http://arduino.cc/en/Tutorial/IfStatement) non c'era scritto...
qui
Ma tu devi anche distinguere fra l'operazione aritmetica di assegnazione "=" e l'operazione di comparazione "==".
http://arduino.cc/en/Reference/If
if (a=0 && b=0)
è diverso da
if (a==0 && b==0)
Nel primo caso chiedi: l'assegnazione di 0 ad a e di 0 a b è stata svolta con successo?
Nel secondo caso chiedi: il contenuto di a è uguale a 0 ed il contenuto di b è uguale a 0?
leo72:
Ma tu devi anche distinguere fra l'operazione aritmetica di assegnazione "=" e l'operazione di comparazione "==".
Non avevo fatto caso a questo errore, banale e molto frequente che non vine rilevato in nessun modo dal compilatore.
Se fai if (A=1) il risultato è che la if è sempre vera perché fai una assegnazione e non un confronto, la sintassi è if (A==1), "==" è l'operatore per l'eguaglianza mentre "=" è l'operatore per l'assegnazione.
Ti consiglio di studiarti i vari operatori del C la e differenza tra operatori logici e bitwise, la if puoi scriverla pure così "if (A==0 & B==1)" però è diverso, e produce effetti diversi, dal scriverla ""if (A==0 && B==1)", a te scoprire la differenza tra le due if
astrobeed:
Non avevo fatto caso a questo errore, banale e molto frequente
soprattutto se si proviene da linguaggi diversi dal C.
la if puoi scriverla pure così "if (A==0 & B==1)" però è diverso, e produce effetti diversi, dal scriverla ""if (A==0 && B==1)", a te scoprire la differenza tra le due if
Già
leo72:
if (a=0 && b=0)
è diverso da
if (a==0 && b==0)
Nel primo caso chiedi: l'assegnazione di 0 ad a e di 0 a b è stata svolta con successo?
Nel secondo caso chiedi: il contenuto di a è uguale a 0 ed il contenuto di b è uguale a 0?
Se non sbaglio ,con if (a=0 && b=0) ,oltre a assegnare lo 0 ad a e b, usi i nuovi valori di a e b come valori booleani per la if(tranne se lo impedisco esplicitamente con overloading di operatori)...è equivalente a
a=0;b=0;
if(a && b)
.. non dipende dal fatto che l'assegnazione abbia sucesso(anche perchè di solito è supposto che avvenga corettamente)..
@astrobeed: nel tuo caso mi sembra che la & e la && producano gli stessi effetti..o sbaglio?(non uso spesso il bitwise)
m_ri:
@astrobeed: nel tuo caso mi sembra che la & e la && producano gli stessi effetti..o sbaglio?(non uso spesso il bitwise)
No, anche per te vale lo stesso consiglio, vai a leggere le differenze tra operatori logici e operatori bitwise
è tutto qui:
astrobeed:
m_ri:
@astrobeed: nel tuo caso mi sembra che la & e la && producano gli stessi effetti..o sbaglio?(non uso spesso il bitwise)No, anche per te vale lo stesso consiglio, vai a leggere le differenze tra operatori logici e operatori bitwise
scusami,ma continuo a essere ignorante...
in if(A==0 & B==1) e if(A==0 && B==1),ho A==0 che mi può restituire true o false,stessa cosa per B==1
chiamo a e b due variabili booleane dove a=A==0 e b=B==1..ok?(in quanto il confronto restituisce un valore booleano,o no?)
a casa mia, if( a && b) è uguale a if(a & b)..dove sbaglio?
qlkn può far notare che mentre | & coinvolgono sempre tutti gli operatori, in alcune implementazioni || e && si fermano quando incontrano un 1(o uno 0)..non so come si comporti il compilatore usato da arduino..
sono andato a cercare un po' di roba su internet e continuo a essere convinto..
vorrei farvi notare che entrambi gli operatori di & o && in questo caso sono dei bool..
m_ri:
vorrei farvi notare che entrambi gli operatori di & o && in questo caso sono dei bool..
Sei tratto in inganno da questo caso, il discorso && o & devi vederlo in generale, p.e. valuta cosa succede se scrivo :
"If ((a > b) && c)" oppure "if ((a > b) & c)"
Il risultato della IF non è sempre lo stesso a seconda del valore che assume C, nel primo caso la IF è vera quando A > B e C è maggiore di 0, nel secondo la IF è vera quando A > B e C ha un qualunque valore dispari.
non ci siamo capiti..vorrei farti notare che avevo scritto @astrobeed:nel tuo caso mi sembra che la & e la && producano gli stessi effetti..o sbaglio?(non uso spesso il bitwise) stavo parlando del tuo caso,non in generale.. (=
e poi,scambi per un newbie totale uno che scrive di overloading di operatori??
ah,per caso sai dirmi se il compilatore usato da arduino quando vede dei && o || esegue sempre tutti gli operandi o salta quelli successivi quando ha una risposta certa?(importante quando usi delle funzioni come operandi)
ah,per caso sai dirmi se il compilatore usato da arduino quando vede dei && o || esegue sempre tutti gli operandi o salta quelli successivi quando ha una risposta certa?(importante quando usi delle funzioni come operandi)
Nel caso di &| salta tutto ciò che segue se il risultato della prima operazione è false, invece &&|| verifica anche le seguenti condizioni.
Per evitare l'errore della if tf=false si usa scrivere la condizione al contrario cioè if false=tf, così il compilatore di da errore perchè un lvalue non può essere una costante. lvalue=rvalue, (l, left e r, right)
Questa è una buona abitudine che ancora non ho preso, sono sempre in tempo.
Ciao.
MauroTec:
Per evitare l'errore della if tf=false si usa scrivere la condizione al contrario cioè if false=tf, così il compilatore di da errore perchè un lvalue non può essere una costante. lvalue=rvalue, (l, left e r, right)
Questa è una buona abitudine che ancora non ho preso, sono sempre in tempo.
Verissimo, e tra parentesi l'errore di scrivere A=qualcosa invece di A==qualcosa nella IF capita a tutti, programmatori esperti inclusi, perché spesso si fanno dei copia e incolla ed è facile incorrere per distrazione in questo errore.
Stessa cosa scrivere A==qualcosa al posto di A=qualcosa in una vera assegnazione, altro errore che il compilatore può non vedere e che porta ad errori run time con effetti imprevedibili.
MauroTec:
Nel caso di &| salta tutto ciò che segue se il risultato della prima operazione è false, invece &&|| verifica anche le seguenti condizioni.
Ah ok, grazie...
chiedo conferma di quello che dico, ma il problema & vs && fondamentalmente si verifica quando metti a confronto 2 variabili di diverso tipo (e quindi diversa dimensione bit), caso molto particolare l'uguaglianza tra interi e float, che con la & va a scatafascio completamente
lesto:
chiedo conferma di quello che dico, ma il problema & vs && fondamentalmente si verifica quando metti a confronto 2 variabili di diverso tipo (e quindi diversa dimensione bit),
Non ha importanza la dimensione, il problema esiste sempre, unico caso dove non fa differenza usare && o &, salvo l'interruzione della if alla prima condizione non vera invece di continuare per tutti gli elementi, è quando sono in gioco valori booleani, dato che possono essere solo TRUE o FALSE non cambia nulla nel risultato finale.
Quando entrano in gioco i float per via dello loro natura esponenziale non è consigliabile usare l'operatore "==" nelle condizioni, il confronto sarà quasi sempre falso anche se i due valori, in teoria, sono identici, o si usa un controllo con un certo fattore di isteresi (min/max), oppure prima si converte il float in un valore intero troncando tutti i decimali inutili per il confronto.