Найти:
Закрытый вопрос
1 хороший вопрос

Уважаемые гуру, не подскажите начинающему, почему результат выражения x=7, x*=x++ равен 50, а не 56?

По идее, после выполнения ++, x должен иметь значение 8, но отдать операции *= значение 7, и в итоге должно получиться x=8*7, но не получается

Спросил: s_evgeny 3 года, 1 месяц назад | Предложить дружбу | Добавить в эксперты

Ответов: 4 | Просмотров: 1142 | Пожаловаться на вопрос

Ответы
1 AD AD

Дело вовсе не в приоритете операций (тем более, что инкремент ++ имеет гораздо более высокий приоритет, чем операция присваивания с умножением). В данном случае инкремент постфиксный (стоит после операнда x), а это значит, что он будет выполняться лишь после того, как x будет использован (в операции присваивания с умножением). Лучше всего это наблюдать у разноимённых переменных: пусть x==7, y==7, нужно вычислить x*=y++. В этом случае y, равный 7, будет передан операции *= и лишь после этого увеличен на 1 операцией ++.

Для того чтобы избавиться от такого эффекта, можно, как уже было описано, использовать разне варианты. А вот префиксный инкремент (++x) в данном случае даст ответ 64. Т.е. x будет увеличен на 1, после чего операция *= будет выполняться над уже этим изменённым значением x.

Ответил: Iv_wise 3 года, 1 месяц назад | Предложить дружбу | Добавить в эксперты

Пожаловаться на ответ
-1 AD AD

постфиксный ++ работает после выполнения операции. эта запись переводится как x = (x * x)++.Это хорошо видно в ассемблере.

UMain.cpp.2029: int x = 7;
00423138 C745F407000000   mov [ebp-$0c],$00000007
UMain.cpp.2030: x *= x++;
0042313F 8B45F4           mov eax,[ebp-$0c]
00423142 0FAF45F4         imul eax,[ebp-$0c]
00423146 8945F4           mov [ebp-$0c],eax
00423149 FF45F4           inc dword ptr [ebp-$0c]

Ответил: vikk 3 года, 1 месяц назад | Предложить дружбу | Добавить в эксперты

Пожаловаться на ответ
1 AD AD

Все дело в приоритете операций. Операция инкремента имеет приоритет ниже, чем умножение с присваиванием. Фактически в приведенном коде происходит так:

(x *= x)++ // 7 * 7 и увеличивается на 1.

Выхода два: либо расставить скобки, явно указав последовательность выполнения операций, либо написать:

x *= ++x;

Ответил: illahad 3 года, 1 месяц назад | Предложить дружбу | Добавить в эксперты

Пожаловаться на ответ
2 AD AD

x*=x++; эквивалентно

x = x * x; x++;

x++ - инкремент после вычисления выражения

++x - инкремент до

Ответил: MichaelTU 3 года, 1 месяц назад | Предложить дружбу | Добавить в эксперты

Пожаловаться на ответ
Темы
Сообщества
Теги
.NET 1C 3D Active Directory C C#.NET C++ C++ Builder Delphi DreamSpark ERP Ethernet EXCEL firefox HTML HTML@ intuit.ru java JavaScript Linux Mac OS Microsoft Vista Microsoft Windows Microsoft Windows XP Pro Microsoft XP OpenOffice.org Pascal PHP service desk shell SQL unix VBA web Wi-Fi Word Word 2007: полное рукодовство WWW администрирование алгоритм алгоритмы английский язык анимация аппаратура архитектура ЭВМ архитектурное моделирование базы данных безопасность беспроводные технологии веб-дизайн верстка видео Видео курс видеокурсы вирусы Вопрос администрации сайта второе высшее высшее образование графика графические форматы диплом дипломы дистанционное обучение документооборот дополнительное образование естественные языки запуск программ игры интелект интеллект интернет интерфейсы интуит информатика исследования история кадры кибернетика книги командная строка компании компиляторы компоненты компьютерные сети консультанты конфиденциальность корпоративные системы криптография крэкинг курсы Локалные сети Локальная версия маршрутизация математика машииное обучение машинное обучение начинающий программист нейронные сети низкоуровневое ПО новейшие разработки новые учебные программы ноутбуки образование обучение объектно-ориентированное программирование объявления оплата оплата сертификата офис память печать пиратство поиск работы получение сертификата предложение предложения Принтеры программирование программное обеспечение проектирование работа сайта разное разработка приложение регистрация реляционные решение робот робототехника сайт сертификат сертификация сетевые операционные системы системы программирования спам текстовые редакторы текстуры телекоммуникационные сети телефония теория теория приближений трояны управление контентом учебная программа учебники учебные курсы учебные программы форматы данных цвета человеко-машинное взаимодействие электронные таблицы электронные учебники Эффективность Эффективность ИТ ядро языки программирования
Вопросы Темы Теги Сообщества Рейтинги Обратная связь Помощь © 2012, Интернет-Университет Информационных Технологий
Проект Издательства "Открытые Системы".
Партнеры: РМ Телеком, KRAFTWAY COMPUTERS.
Rambler's Top100