Перейти к содержанию
    

Последовательность проведения операций в С

Помнит ли кто спецификацию языка С?

Мне казалось, что битовые операции должны выполняться раньше оперций сравнения.

Например, такой код

if( *ptr & 0x0F == 0x01 )

Сколько я помнил, сначала должна быть выполнена операция &, а потом ==. В отличие, например от

if( *ptr && 0x0F == 0x01 )

Где сначало должно пройти сравнение, а потом &&.

 

Если я не ошибаюсь, то ошибается IAR 4.40, он на первый пример полностью пропускает весь код, считая что 0x0F никогда не равен 0x01. Я решил этот вопрос скобками, но все же...

if( (*ptr & 0x0F) == 0x01 )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне казалось, что битовые операции должны выполняться раньше оперций сравнения.

Не упрощайте - даже "битовые" (полагаю имелись ввиду "логические")имеют меж собой разный приоритет.

И операции "сравнения" (полагаю речь идет об операциях "отношения" и операции "эквивалентность") тоже.

if( *ptr & 0x0F == 0x01 )

Сколько я помнил, сначала должна быть выполнена операция &, а потом ==. В отличие, например от

Нет, "эквивалентнось" имеет более высокий приоритет, "нежели логическое И"

if( *ptr && 0x0F == 0x01 )

Где сначало должно пройти сравнение, а потом &&.

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

Я решил этот вопрос скобками

И не жалейте скобок и впредь!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У побитовых операций приоритет выше, но еще выше у оператора разыменования. При этом для него операция выполняеться справа налево

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо. Да нашел спецификацию. Что же это нам в институте внушили, что битовые операции сродни математическим. Был не прав, вспылил. Вот правильный стек приоритетов.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...