EMZETT.
Login

Kurz: In C gibt es keinen eigenen Wahrheitswert-Zwang: 0 ist falsch, alles andere ist wahr.

Teil des Kurses C

Kapitel 4 von 15 im Kurs C. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Arithmetik und Vergleiche

OperatorBedeutung
+ - * / %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

Achtung

Mehrere Änderungen derselben Variable in einem Ausdruck (zum Beispiel printf("%d %d", i++, ++i)) haben keine definierte Reihenfolge. Das Ergebnis hängt vom Compiler ab. Ändere eine Variable pro Anweisung.

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

OperatorBedeutung
&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

Übungsaufgabe

Schreibe Funktionen bitGesetzt(x, n), setzeBit(x, n) und loescheBit(x, n) und gib x jeweils binär aus.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Variablen und Datentypen

Weiter: Ein- und Ausgabe

Alle Kapitel: C im Überblick