Несмотря на то, что я повесил на стенку на рабочем месте таблицу с приоритетами операций в Си/Си++, всё равно иногда напарываюсь.

Я очень люблю операцию ?:. Она позволяет многие длинные конструкции заменять на более короткие -- и более понятные. Хотя наворотить с ней можно и совершенно непонятную фигню.

Вот, например, вместо:

if(a>3) a++; else a--;

можно написать:

a+=a>3?1:-1;

Не всем кажется, что второй вариант понятен, но я не про это.

Приоритет этой операции один из самых низких. Он такой же, как у присваивания, поэтому в данном случае всё правильно работает только за счёт того, что ассоциативность у присваивания -- справа налево (за счёт этого работают штуки вроде a=b=c=0. То есть, ?: вычисляется раньше, чем присваивание.

Но могут быть и более сложные случаи, например:

a=x*invert?1:-1;

Тут ошибка. Сначала икс умножится на инверт, в то время как задумка была в том, чтобы a получила значение либо x, либо -x. Вот на этом-то я и накололся.

Поэтому ?: надо всегда заключать в скобки:

a=x*(invert?1:-1);