Bewerkingen

invloed van het variabelentype

C++ kent heel wat bewerkingen. De meeste spreken voor zichzelf, maar je moet wel rekening houden met het type van de operanden waarmee een bewerking wordt uitgevoerd.

Als algemene regel geldt dat het resultaat van een bewerking van hetzelfde type zal zijn als dat van de grootste operand. Wanneer de types van de operanden gelijk zijn is het eenvoudig. Ook het resultaat zal van hetzelfde type zijn.

Wanneer een bewerking op operanden van een verschillend type wordt uitgevoerd, zal het resultaat van hetzelfde type zijn als de het type van de operand die meest plaats inneemt.

Valkuil

Denk er aan dat de waarde die in een variabele kan worden opgeslagen beperkt is volgens het type van variabele. Zo zal een variabele x die een waarde 250 bevat na het optellen van 50 bij de variabele een overflow geven. Het resultaat zal dus 44 (300-256) zijn i.p.v. 300.

Via onderstaande code is dit uit te testen.

void setup() {
  Serial.begin(115200);
}

void loop() {
  byte x=250;
  Serial.println(x);
  x=x+50;
  Serial.println(x);
}

In bovenstaand programma maken we gebruik van de seriële verbinding tussen Arduino en PC om de resultaten zichtbaar te maken.

In de loop()-functie wordt een byte x gedefinieerd en geïnitialiseerd met de waarde 250. De inhoud van x wordt doorgestuurd naar de terminal waarop de waarde 250 verschijnt in het terminalvenster.

Daarna wordt x verhoogd met 50 en opnieuw via het serieel kanaal verstuurd. In het terminalvenster verschijnt nu 44.

Ook het combineren van types kan problemen opleveren.

Valkuil

Wanneer we bij byte x een waarde optellen die een float is (dus een kommagetal) lijkt dit in eerste instantie geen problemen op te leveren. De code

void setup(){
  Serial.begin(115200);
  }
 
void loop() {
  byte x=250;
  Serial.println(x);
  x=x+5.0;
  Serial.println(x);
  }

levert in het terminalvenster mooi de waarden 250 en 255 op. Wanneer we van de 5.0 echter 50.0 maken, krijgen we dus overflow, maar het resultaat dat in het terminalvenster verschijnt is nu ook 250 en 255. Bij een overflow met een float krijgen we dus een ander resultaat (255) dan bij een overflow met een byte waar het resultaat 44 was.

samengestelde bewerkingen

C++ kent enkele verkorte notaties voor de gangbare bewerkingen

uitdrukking kan verkort geschreven worden als
i = i + 1 i++
i = i - 1 i--
x = x + y x+ = y
x = x - y x- = y
x = x * y x* = y
x = x / y x/ = y
 

vergelijkingen

betekenis uitdrukking
is gelijk aan ==
is verschillend van !=
is groter dan >
is kleiner dan <
is groter dan of gelijk aan

>=

is kleiner dan of gelijk aan <=

Valkuil

Merk op dat een enkel gelijkheidsteken dient voor een toekenning. Zo is de uitdrukking

x = y;

een toekenning van de waarde van y aan de variabele x, terwijl de uitdrukking

x == y;

een vergelijking is van de waarden van x en y die resulteert in de uitdrukking TRUE (1) of FALSE (0).

logische bewerkingen

C++ kent uiteraard ook de logische functies AND, OR en NOT. Ze kunnen echter onder verschillende vormen voorkomen.

Een logische uitdrukking is een uitdrukking die resulteert in de logische constante TRUE (1) of FALSE (0). Zo zal de code

void setup(){
  Serial.begin(115200);
  }
 
void loop() {
  Serial.println(3==3);
  }

in het terminalvenster een 1 opleveren, terwijl

void setup(){
  Serial.begin(115200);
  }
 
void loop() {
  Serial.println(3==4);
  }

een nul doet verschijnen.

We kunnen met deze logische uitdrukkingen bewerkingen uitvoeren door gebruik te maken van de logische operatoren &&, || en !.

Dit komt uiteraard veel voor in een voorwaardelijke instructie zoals een if-constructie (zie verder)

if (x>0 && x<5) { Serial.print("x ligt tussen 0 en 5"); }

Dit werkt ook met getallen, maar daarbij moeten we rekening houden dat alleen het cijfer 0 als FALSE geïnterpreteerd wordt, terwijl elke andere waarde voor TRUE doorgaat. Zo zal de uitdrukking 3&&2 een 1 (=TRUE) opleveren, terwijl een 3&&0 als resultaat een 0 (FALSE) geeft.