Arithmetik und Vergleiche
| Operator | Bedeutung |
|---|---|
+ - * / % | Grundrechenarten und Rest (% nur für Ganzzahlen) |
++ -- | um 1 erhöhen/verringern (Präfix und Postfix) |
== != < > <= >= | Vergleiche, Ergebnis 1 (wahr) oder 0 (falsch) |
&& || ! | und, oder, nicht (mit Kurzschluss) |
= += -= *= /= %= | Zuweisungen |
? : | Bedingungsoperator |
sizeof, &, * | Größe, Adresse, Dereferenzierung |
In C gibt es keinen eigenen Wahrheitswert-Zwang: 0 ist falsch, alles andere ist wahr.
#include <stdio.h>
int main(void) {
int a = 17, b = 5;
printf("%d %d %d %d %d\n", a + b, a - b, a * b, a / b, a % b);
printf("%d %d %d\n", a > b, a == b, !(a > b));
printf("%d %d\n", a > 10 && b < 3, a > 10 || b < 3);
int i = 5;
int alt = i++; // erst benutzen, dann erhöhen
int neu = ++i; // erst erhöhen, dann benutzen
printf("%d %d %d\n", alt, neu, i);
int x = 10;
x += 5; x *= 2; x -= 1; x /= 3; x %= 7;
printf("%d\n", x);
printf("%d\n", a > b ? a : b);
return 0;
}Ausgabe
22 12 85 3 2 1 0 0 0 1 5 7 7 2 17
Der Klassiker: = oder ==
#include <stdio.h>
int main(void) {
int x = 5;
if (x == 5) printf("gleich 5\n");
// if (x = 3) ... Zuweisung statt Vergleich! Immer wahr (3 ist != 0), und x wird 3.
return 0;
}Ausgabe
gleich 5
-Wall warnt vor if (x = 3). Manche schreiben die Konstante nach links (if (5 == x)), dann wäre 5 = x ein Fehler.
Bitoperatoren
| Operator | Bedeutung |
|---|---|
& | und |
| | oder |
^ | exklusiv-oder |
~ | Bits umkehren |
<< >> | Verschieben |
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint8_t flags = 0;
const uint8_t LESEN = 1u << 0, SCHREIBEN = 1u << 1, AUSFUEHREN = 1u << 2;
flags |= LESEN | SCHREIBEN; // Bits setzen
printf("flags = %d\n", flags);
printf("darf schreiben: %d\n", (flags & SCHREIBEN) != 0);
flags &= ~SCHREIBEN; // Bit löschen
flags ^= AUSFUEHREN; // Bit umschalten
printf("flags = %d\n", flags);
printf("%d %d %d\n", 0xF0 & 0x3C, 0xF0 | 0x0F, 1 << 10);
return 0;
}Ausgabe
flags = 3 darf schreiben: 1 flags = 5 48 255 1024
Bits setzen: x |= maske, löschen: x &= ~maske, umschalten: x ^= maske, prüfen: (x & maske) != 0.
Rangfolge (Auszug)
Von stark nach schwach: () [] ->, ! ~ ++ -- * & sizeof, * / %, + -, << >>, < <=, == !=, &, ^, |, &&, ||, ?:, = +=, ,. Bei Mischungen aus Bit- und Vergleichsoperatoren immer Klammern setzen: x & 1 == 0 bedeutet x & (1 == 0)!
#include <stdio.h>
int main(void) {
int x = 6;
printf("%d %d\n", x & 1 == 0, (x & 1) == 0);
printf("%d\n", 2 + 3 * 4);
printf("%d\n", (2 + 3) * 4);
return 0;
}Ausgabe
0 1 14 20
Umwandlungen in Ausdrücken
Bei Mischungen wandelt C kleinere Typen in größere um (int + double → double). Mit (typ) erzwingst du eine Umwandlung:
#include <stdio.h>
int main(void) {
int summe = 7, anzahl = 2;
printf("%d\n", summe / anzahl); // int / int: 3 (Nachkommastellen fehlen)
printf("%f\n", (double) summe / anzahl); // 3.5
unsigned int u = 3;
int s = -5;
printf("%d\n", s < u); // Falle: s wird in unsigned umgewandelt, -5 wird riesig
return 0;
}Ausgabe
3 3.500000 0
Vermische vorzeichenbehaftete und vorzeichenlose Zahlen nicht in Vergleichen.
Merke
- 0 ist falsch, alles andere wahr; Vergleiche liefern 1 oder 0
=ist Zuweisung,==Vergleich; Compiler-Warnungen aktivieren- Bits:
&,|,^,~,<<,>>für Flags und Masken - Bei gemischten Operatoren Klammern setzen
- Pro Anweisung höchstens eine Änderung derselben Variable
- Vorzeichenbehaftet/-los nicht mischen
Aufgabe
Schreibe Funktionen bitGesetzt(x, n), setzeBit(x, n) und loescheBit(x, n) und gib x jeweils binär aus.