Я очень люблю операцию ?:. Она позволяет многие длинные конструкции заменять на более короткие -- и более понятные. Хотя наворотить с ней можно и совершенно непонятную фигню.
Вот, например, вместо:
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);