реклама на сайте
подробности

 
 
> Последовательность проведения операций в С
Мусатов Констант...
сообщение Feb 28 2007, 14:58
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



Помнит ли кто спецификацию языка С?
Мне казалось, что битовые операции должны выполняться раньше оперций сравнения.
Например, такой код
if( *ptr & 0x0F == 0x01 )
Сколько я помнил, сначала должна быть выполнена операция &, а потом ==. В отличие, например от
if( *ptr && 0x0F == 0x01 )
Где сначало должно пройти сравнение, а потом &&.

Если я не ошибаюсь, то ошибается IAR 4.40, он на первый пример полностью пропускает весь код, считая что 0x0F никогда не равен 0x01. Я решил этот вопрос скобками, но все же...
if( (*ptr & 0x0F) == 0x01 )
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
zltigo
сообщение Feb 28 2007, 15:39
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Мусатов Константин @ Feb 28 2007, 13:58) *
Мне казалось, что битовые операции должны выполняться раньше оперций сравнения.

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

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

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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Feb 28 2007, 15:43
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



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


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
Мусатов Констант...
сообщение Feb 28 2007, 15:51
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



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

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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st July 2025 - 13:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01368 секунд с 7
ELECTRONIX ©2004-2016