Damit der Compiler einen Ausdruck korrekt auswerten kann, muss er wissen in welcher Reihenfolge die Operatoren ausgewertet werden müssen. Diese Reihenfolge bestimmt auch, ob der Programmierer eventuell Klammern setzen muss, um das erwartete Ergebnis zu erhalten.

Die folgende Tabelle zeigt, wie die Operatoren gewichtet werden:


Quelle: http://en.cppreference.com/w/c/language/operator_precedence

Beispielcode:

#include <stdio.h>

int main()
{
    int a = 1;
    int b = 2;
    int c = 3;
    int *pA = &a;
    int *pB = &b;
    int *pC = &c;

    int res1 = a + b * c;
    int res2 = (a + b) * c;
    printf("res1 = %d\n", res1);
    printf("res2 = %d\n", res2);

    int res3 = *pA**pB**pC;
    int res4 = (*pA) * (*pB) * (*pC);
    printf("res3, res4 = %d, %d\n", res3, res4);

    int flags1 = 0x00000001;
    int flags2 = 0x00000002;
    int flags3 = 0x00000004;

    int res5 = flags1 | flags2 | flags3 == 0x00000007; // warning: suggest parentheses around comparison
    int res6 = (flags1 | flags2 | flags3) == 0x00000007;
    printf("res5 == res6? %s\n", res5 == res6 ? "yes" : "no");

    return 0;
}

Folgende Beobachtungen können wir machen:

  • Zeile 12/13: Punktrechnung geht vor Strichrechnung. Wie in der Mathematik. Soll erst addiert werden, werden Klammern benötigt.
  • Es gibt zwei Arten des "*"-Operators. Dabei ist die Dereferenzierung wichtiger als die Multiplikation. Zeile 17 und 18 sind damit identisch.
  • In Zeile 25 ist "==" höher gewichtet als das ODER. So wird nur flags3 vergichen und nicht die Summe der Bits. Um das Ziel zu erreichen ist eine Klammerung notwendig.

...


Last modified: Friday, 25 May 2018, 3:42 PM