1. (1<<(3+1)) – das ist eine der bösen Fallen, denn die shift-Operatoren haben eigentlich etwas “punktiges” an sich, und jedeR würde vermuten, dass sie stärker binden als “strichige” Operatoren. Tun sie aber nicht.
  2. (a = (b = c)) – das ist nicht unvernünftig, man kann also in C in relativ harmloser Weise Mehrfachzuweisungen machen, was auch der Grund für die spezielle Assoziativität der Zuweisung ist. In Python geht das übrigens auch, aber dort ist das eine spezielle Form des Zuweisungsstatements.
  3. (a < (b < c)) – das ist potenziell fies, denn das macht keineswegs den Mehrfachvergleich, den man vielleicht gern gehabt hätte, obwohl es syntaktisch durchaus legal ist. Wenn ihr die Falle nicht gleich seht, berechnet den Ausdruck für eine handvoll gut gewählter Werte von a, b und c. In Python sind Intervallvergleiche dieser Art legal und tun auch, was man gerne hätte (wenn man nicht klammert).
  4. (a = (b==((a*b)/5))) – die Klammerung des Ausdrucks mit Multiplikation und Division sieht wegen Linksassoziativität so aus.
  5. (a = (15 || ((a&(8==(1<<3))) && (b<=5)))) – hier sind gleich zwei Fallen drin – zum einen ist am Anfang kein Vergleich (mit relativ hoher Präzendenz), sondern eine Zuweisung (mit niedriger Präzedenz), zum anderen hat die Gleichheitsprüfung eine höhere Präzedenz als das logische Und, was den zweiten Teil des Vergleichs kaputt macht.