Форум программистов, компьютерный форум CyberForum.ru

приоритет. странно - C++

Восстановить пароль Регистрация
 
spoonnn
Сообщений: n/a
09.08.2012, 12:29     приоритет. странно #1
привет всем прогерам С++ =) есть такой вопрос.
Вроде ни чего сложного, но компилятор компилит это дело не так как ожидается.
Есть такое предложение.
IN = *block++ << 8;
если указатель block ссылается на начало массива M
M[10] = {1,2,3,4,5,6,7,8,9,10};
То по таблице приоритетов сначала выполнится ++ затем * после << и только в конце будет =.
В IN должно оказаться число 512, НОоо по каким то причинам там оказывается 256.
даже если записать выражение так
IN =((*block++) << 8);
все равно такой же результат =(.
Проведя эксперименты над этой строкой, разбивая ее на части и смотря, что выполняется первым, что вторым я пришел к выводу, что сначала выполняется * после << после = и лишь после ++ ..... и в строке
IN =((*block++) << 8);
скобки не могут исправить эту последовательность может кто знает? ПОЧЕМУ ТАК ВЫХОДИТ???
для справок: ИСпользую visual studio 2010, также keil. И там и там один и тот же результат =(
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2012, 12:29     приоритет. странно
Посмотрите здесь:

C++ Приоритет операций
Как установить приоритет сервису C++
C++ Приоритет преобразований внутри if
C++ приоритет операций
C++ приоритет потоков
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
09.08.2012, 12:34     приоритет. странно #2
постфиксный инкремент, не?
приоритет. странно
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
09.08.2012, 12:37     приоритет. странно #3
Оператор постинкремента инкрементирует указатель (block) и как результат своего выполнения возвращает то значение, которое указатель имел до выполнения операции инкремента; сам же указатель получает инкрементированное значение. Это не зависит от компилятора.
spoonnn
Сообщений: n/a
09.08.2012, 12:42     приоритет. странно #4
я думал что у скобок самый высокий приоритет в с++. т.е. если закрыть скобками (*block++), то выполнится ++, а после все остальное. Разве не так??

Добавлено через 1 минуту
Цитата Сообщение от CheshireCat Посмотреть сообщение
Оператор постинкремента инкрементирует указатель (block) и как результат своего выполнения возвращает то значение, которое указатель имел до выполнения операции инкремента; сам же указатель получает инкрементированное значение. Это не зависит от компилятора.
Спасибо это все объясняет=))
wtf?
19 / 19 / 0
Регистрация: 03.10.2010
Сообщений: 48
09.08.2012, 12:43     приоритет. странно #5
Дело в том что ты используеш постфиксный инкремент, а он выполняется в самом конце, а в таблице приоритетов указан префиксный инкремент..
Нужно использовать префиксный тоисть:
IN = *(++block) << 8;
Таким образом сначала выполняется "++" потом "*", потом "<<" ну а потом уже присваивание
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
09.08.2012, 12:43     приоритет. странно #6
Цитата Сообщение от spoonnn Посмотреть сообщение
я думал что у скобок самый высокий приоритет в с++. т.е. если закрыть скобками (*block++), то выполнится ++, а после все остальное. Разве не так??
причем тут скобки ?
постфиксный инкремент срабатывает раньше, НО возвращает предыдущее значение!
Yandex
Объявления
09.08.2012, 12:43     приоритет. странно
Ответ Создать тему
Опции темы

Текущее время: 12:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru