Pages: [1] 2   Go Down
Author Topic: IF a=0 AND b=1  (Read 1160 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 138
Posts: 9887
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)



Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie.


Mi sai indicare uina guida per la IDE ?

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

Torino
Offline Offline
Full Member
***
Karma: 0
Posts: 133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

qui

http://arduino.cc/en/Reference/Boolean
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 336
Posts: 23142
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 138
Posts: 9887
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley
« Last Edit: March 15, 2012, 10:19:32 am by astrobeed » Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 336
Posts: 23142
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley
Già  smiley-razz
Logged


Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
if (a=0 && b=0)
è diverso da
Code:
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:
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)
« Last Edit: March 15, 2012, 01:49:46 pm by m_ri » Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 138
Posts: 9887
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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..
« Last Edit: March 15, 2012, 01:31:25 pm by m_ri » Logged

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 138
Posts: 9887
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.


Logged

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
« Last Edit: March 15, 2012, 02:05:28 pm by m_ri » Logged

0
Offline Offline
Faraday Member
**
Karma: 31
Posts: 2908
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Pages: [1] 2   Go Up
Jump to: