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

Порядок вычисления выражения - C++

Восстановить пароль Регистрация
 
_Eldar_
 Аватар для _Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
16.04.2012, 08:19     Порядок вычисления выражения #1
Привет всем!

Не пойму как вычисляется выражение : p = (p | e++ >> 2) & (++p >> 1), при р = 3;
у меня результат: p = 0, хотя считаю все вручную получается р = 2.
Помоему сначала должно посчитаться выражение в первой скобке (p | e++ >> 2) (оно равно 3),
затем во второй скобке (++p >> 1) (равно 2), т.к. поразрядное "И" выполняется слева направо. А компилятор сначала увеличивает p на единицу, а уже потом делает остальные операции (ИМХО). Почему так происходит?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
16.04.2012, 08:36     Порядок вычисления выражения #2
Цитата Сообщение от _Eldar_ Посмотреть сообщение
(p | e++ >> 2)
А вот тут сначала выполняется "ИЛИ" или "сдвиг" по-Вашему?
_Eldar_
 Аватар для _Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
16.04.2012, 09:01  [ТС]     Порядок вычисления выражения #3
fasked, сначала ИЛИ

Добавлено через 39 секунд
fasked, а затупил СДВИГ сначала

Добавлено через 2 минуты
fasked,
1) e++ >> 2 = 1
2) p | 1 = 3

Добавлено через 9 минут
Ну так почему префиксный инкремент выполняется самым первым, игнорируя скобки и порядок операции "&" (слева направо). Кто знает?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
16.04.2012, 09:08     Порядок вычисления выражения #4
_Eldar_, я что-то сразу проглядел. Этот код и не должен выполняться, так как Вы ожидаете. Одна переменная изменяется дважды в пределах одной точки следования. А согласно стандарту языка это называется unspecified behavior. Нельзя так писать, потому что последствия непредсказуемы. Скорее всего, используя другой компилятор, Вы получите другой результат при таком коде.

Подробности здесь: http://alenacpp.blogspot.com/2005/11...ce-points.html
_Eldar_
 Аватар для _Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
16.04.2012, 09:20  [ТС]     Порядок вычисления выражения #5
fasked, Спасибо. Все понятно, хреново, что это задание лабораторной работы(

Добавлено через 3 минуты
fasked, и причем это не опечатка(, во всех вариантах лабы переменные изменяются дважды в одной точке следования. Ладно тема закрыта.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
16.04.2012, 10:09     Порядок вычисления выражения #6
_Eldar_, как вариант, если это позволяется, можно разбить выражение на несколько.
Yandex
Объявления
16.04.2012, 10:09     Порядок вычисления выражения
Ответ Создать тему
Опции темы

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