Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Последовательность проведения операций в С
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Мусатов Константин
Помнит ли кто спецификацию языка С?
Мне казалось, что битовые операции должны выполняться раньше оперций сравнения.
Например, такой код
if( *ptr & 0x0F == 0x01 )
Сколько я помнил, сначала должна быть выполнена операция &, а потом ==. В отличие, например от
if( *ptr && 0x0F == 0x01 )
Где сначало должно пройти сравнение, а потом &&.

Если я не ошибаюсь, то ошибается IAR 4.40, он на первый пример полностью пропускает весь код, считая что 0x0F никогда не равен 0x01. Я решил этот вопрос скобками, но все же...
if( (*ptr & 0x0F) == 0x01 )
zltigo
Цитата(Мусатов Константин @ Feb 28 2007, 13:58) *
Мне казалось, что битовые операции должны выполняться раньше оперций сравнения.

Не упрощайте - даже "битовые" (полагаю имелись ввиду "логические")имеют меж собой разный приоритет.
И операции "сравнения" (полагаю речь идет об операциях "отношения" и операции "эквивалентность") тоже.
Цитата
if( *ptr & 0x0F == 0x01 )
Сколько я помнил, сначала должна быть выполнена операция &, а потом ==. В отличие, например от

Нет, "эквивалентнось" имеет более высокий приоритет, "нежели логическое И"
Цитата
if( *ptr && 0x0F == 0x01 )
Где сначало должно пройти сравнение, а потом &&.

Просто "условное И" имеет еще много более низкий приоритет, нежели "=="
Цитата
Я решил этот вопрос скобками

И не жалейте скобок и впредь!
beer_warrior
У побитовых операций приоритет выше, но еще выше у оператора разыменования. При этом для него операция выполняеться справа налево
Мусатов Константин
Спасибо. Да нашел спецификацию. Что же это нам в институте внушили, что битовые операции сродни математическим. Был не прав, вспылил. Вот правильный стек приоритетов.

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
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.