kostya-m 0 28 февраля, 2007 Опубликовано 28 февраля, 2007 · Жалоба Помнит ли кто спецификацию языка С? Мне казалось, что битовые операции должны выполняться раньше оперций сравнения. Например, такой код if( *ptr & 0x0F == 0x01 ) Сколько я помнил, сначала должна быть выполнена операция &, а потом ==. В отличие, например от if( *ptr && 0x0F == 0x01 ) Где сначало должно пройти сравнение, а потом &&. Если я не ошибаюсь, то ошибается IAR 4.40, он на первый пример полностью пропускает весь код, считая что 0x0F никогда не равен 0x01. Я решил этот вопрос скобками, но все же... if( (*ptr & 0x0F) == 0x01 ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 28 февраля, 2007 Опубликовано 28 февраля, 2007 · Жалоба Мне казалось, что битовые операции должны выполняться раньше оперций сравнения. Не упрощайте - даже "битовые" (полагаю имелись ввиду "логические")имеют меж собой разный приоритет. И операции "сравнения" (полагаю речь идет об операциях "отношения" и операции "эквивалентность") тоже. if( *ptr & 0x0F == 0x01 ) Сколько я помнил, сначала должна быть выполнена операция &, а потом ==. В отличие, например от Нет, "эквивалентнось" имеет более высокий приоритет, "нежели логическое И" if( *ptr && 0x0F == 0x01 ) Где сначало должно пройти сравнение, а потом &&. Просто "условное И" имеет еще много более низкий приоритет, нежели "==" Я решил этот вопрос скобками И не жалейте скобок и впредь! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 28 февраля, 2007 Опубликовано 28 февраля, 2007 · Жалоба У побитовых операций приоритет выше, но еще выше у оператора разыменования. При этом для него операция выполняеться справа налево Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostya-m 0 28 февраля, 2007 Опубликовано 28 февраля, 2007 · Жалоба Спасибо. Да нашел спецификацию. Что же это нам в институте внушили, что битовые операции сродни математическим. Был не прав, вспылил. Вот правильный стек приоритетов. Symbol Name or Meaning Associativity Highest Precedence ++ Post-increment Left to right -- Post-decrement ( ) Function call [ ] Array element -> Pointer to structure member . Structure or union member ++ Pre-increment Right to left -- Pre-decrement :> Base ! Logical NOT ~ Bitwise NOT - Unary minus + Unary plus & Address * Indirection sizeof Size in bytes new Allocate program memory delete Deallocate program memory (type) Type cast [for example, (float) i] .*_ Pointer to member (objects) Left to right ->* Pointer to member (pointers) * Multiply Left to right / Divide % Remainder + Add Left to right - Subtract << Left shift Left to right >> Right shift < Less than Left to right <= Less than or equal to > Greater than >= Greater than or equal to == Equal Left to right != Not equal & Bitwise AND Left to right ^ Bitwise exclusive OR Left to right | Bitwise OR Left to right && Logical AND Left to right || Logical OR Left to right ? : Conditional Right to left = Assignment Right to left *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= Compound assignment , Comma Left to right Lowest Precedence Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться