Istruzione strana

in uno sketch reperito su internet ho trovato la seguente istruzione:

 ledState ^= 1;

che non riesco a capire cosa fa, oppure se è un errore di digitazione.
Qualcuno me lo potrebbe spiegare ?
il contesto dove è inserita è il seguente:

void lamp() {
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis; 
    ledState ^= 1;
    digitalWrite(ledGreen, ledState);
  }
}

Basta, come al solito, andare nel reference e leggere la spiegazione :wink:

Quando hai qualche dubbio fai sempre riferimento al refernce completo.

Guglielmo

P.S.: Quel codice, come avari capito leggendo il reference, fa lampeggiare un LED con semiperiodo uguale a "interval" :slight_smile:

Grazie,
avevo cercato su internet, ma non avevo trovato niente o avevo impostato male la chiave di ricerca.
conoscevo gli operatori tipo += o *= ma non quello, che se ho capito bene fa la stessa cosa di x != x

No, in realtà fa il XOR di una variabile A con una variabile B ed assegna il risultato ad A.

In alcuni casi, il risulato è quello che hai detto tu, ma sono casi particolari :wink:

Guglielmo

Infatti, a confermare le parole di Guglielmo, luso di quella istruzione sarebbe formalmente sbagliato
Trattandosi di operazioni su variabil booleane si dovrebbe usare il not (!) e non lo XOR, che amdrebbe applicato a varibili con più bit

In effetti il c++ dovrebbe prevedere uno specifico warning di tipo

... quanto meno richiede una certa attenzione ... il gioco funziona se la variabile è all'inizio 0 ed allora, ogni volta che si fa il XOR con 1, alterna il suo valore tra 0 ed 1 (0 ^ 1 = 1 e poi 1 ^ 1 = 0), ma, se per caso contenesse un altro valore, l'inversione NON ci sarebbe più.

Usando invece l'operatore logico le cose funzionerebbero anche su sistemi in cui il TRUE è rappresentato con un valore diverso da 1 (es. 0xFF) ... difatti il NOT ( ! ) darebbe comunque FALSE e applicato di nuovo darebbe di nuovo TRUE ... facendo funzionare il tutto :slight_smile:

Guglielmo

1 Like

Per questo dico che in c++ dovrebbe esserci un warning di tipo

1 Like

Magari se dall'ide si impostano i warning al massimo, "appare per magia"!

2 Likes

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.