IF a=0 AND b=1

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 :slight_smile:

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 :slight_smile:

Già :stuck_out_tongue:

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?? :cold_sweat:

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... :slight_smile:

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.