Go Down

Topic: IF a=0 AND b=1 (Read 1 time) previous topic - next topic

acik

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.


astrobeed


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)




acik

Grazie.


Mi sai indicare uina guida per la IDE ?

QUI (http://arduino.cc/en/Tutorial/IfStatement) non c'era scritto...


leo72

Ma tu devi anche distinguere fra l'operazione aritmetica di assegnazione "=" e l'operazione di comparazione "==".
http://arduino.cc/en/Reference/Assignment
http://arduino.cc/en/Reference/If

Code: [Select]
if (a=0 && b=0)
è diverso da
Code: [Select]
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?

astrobeed

#5
Mar 15, 2012, 12:16 pm Last Edit: Mar 15, 2012, 04:19 pm by astrobeed Reason: 1

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

leo72


Non avevo fatto caso a questo errore, banale e molto frequente

soprattutto se si proviene da linguaggi diversi dal C.

Quote
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à  :P

m_ri

#7
Mar 15, 2012, 03:20 pm Last Edit: Mar 15, 2012, 07:49 pm by m_ri Reason: 1

Code: [Select]
if (a=0 && b=0)
è diverso da
Code: [Select]
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
Code: [Select]
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)

astrobeed


@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

BrainBooster


m_ri

#10
Mar 15, 2012, 07:22 pm Last Edit: Mar 15, 2012, 07:31 pm by m_ri Reason: 1


@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..

m_ri

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

astrobeed


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.



m_ri

#13
Mar 15, 2012, 07:56 pm Last Edit: Mar 15, 2012, 08:05 pm by m_ri Reason: 1
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??  :smiley-roll-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)

MauroTec

Quote
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.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Go Up