Я обычно приоритеты не помню и явно ставлю скобочки. Но не всегда. Операция приведения типа имеет больший приоритет, чем арифметические.
Пусть есть переменные:
double a, b;
Хотим получить целое частное. Пишем:
int c= (int)a/b;
Сначала a будет приведено к типу int. Потом поделено на b. Но b типа double! Если операнды разного типа, то они преобразуются к типу, который занимает больше памяти! a преобразуется обратно double, делится на b, а потом результат неявно преобразуется в обратно в int. Сумасшедший дом. Тут надо определиться, что же мы хотели получить. Надо ли было преобразовывать оба операнда к целому или только результат их деления?
Чем это может быть чревато. В конкретном случае, с которым я столкнулся, у меня ситуация была хуже, там было -1+(int)a/b, после чего сравнение с нулём на "больше". (int)a/b давало результат, близкий к единице. Чуть больше. при сложении с -1, она также преобразовывалась к типу double. В итоге результат был около 1e-7. Что больше нуля (при сравнении ноль тоже преобразовывался к double) -- условие выполняется. А если бы оба операнда при делении были преобразованы -- (int)a/(int)b, то частное было бы 1, 1-1 == 0 и условие не выполняется.
Короче говоря, следует бояться не только неявного, но и явного преобразования типов. И чётко представлять себе, чего нужно достичь. Считаю вышеприведённый эпизод проявлением своей некомпетентности.