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)



Usare il GOTO in C è ammettere la propria sconfitta come programmatore

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  :)
Usare il GOTO in C è ammettere la propria sconfitta come programmatore

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
Usare il GOTO in C è ammettere la propria sconfitta come programmatore

BrainBooster

è tutto qui:
http://arduino.cc/en/Reference/HomePage?from=Reference.Extended

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.


Usare il GOTO in C è ammettere la propria sconfitta come programmatore

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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy