Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2012, 22:33   #11
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Позвольте поставить жирную точку в вашем, господа, споре согласившись с дамами:
Код:
	*ptr++=55;
004113AE  mov         eax,dword ptr [ebp-28h]  // Получаем указатель
004113B1  mov         dword ptr [eax],37h        // Заносим в указанное указателем место значение
004113B7  mov         ecx,dword ptr [ebp-28h]  // Не знаю почему, но снова получаем указатель
004113BA  add         ecx,4                             // инкрементируя его (тип int в примере)
004113BD  mov         dword ptr [ebp-28h],ecx  // не забыв обновить переменную.
P.S. Интересно зачем VS понадобилось ЕСХ задействовать...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.02.2012, 00:15   #12
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от MooNDeaR Посмотреть сообщение
Вот именно. Поэтому и выполнится сначала разыменование, присвоение, а уже потом инкремент.
Ну, не согласен. Мне кажется, хорошим примером разрешения приоритетов операций может послужить этот небольшой кусок кода:
Код:
#include <iostream>

class OpTest {
public:
  OpTest operator++ (int) {
    std::cout << "OpTest::operator++" << std::endl;
    return *this;
  }

  OpTest& operator* () {
    std::cout << "OpTest::operator*" << std::endl;
    return *this;
  }

  OpTest& operator= (int) {
    std::cout << "OpTest::operator=" << std::endl;
    return *this;
  }
};

int main() {
  OpTest op;
  *op++ = 0;
}
Результат выполнения можно поглядеть по ссылке
netrino вне форума Ответить с цитированием
Старый 15.02.2012, 01:03   #13
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Может, приорететность зависит от языка программирования и среды?
Ведь Виталик делал, если я не ошибаюсь, в среде для ассемблера, а netrino в С++
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 15.02.2012, 01:15   #14
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Blondy Посмотреть сообщение
Может, приорететность зависит от языка программирования и среды?
Ведь Виталик делал, если я не ошибаюсь, в среде для ассемблера, а netrino в С++
Тут не в том дело, Stilet точно также написал программу на C++, но затем дизассемблировал и привёл код, в который программа была скомпилирована. Фактически, компилятор не обязан генерировать машинный код в точном соответствии со спецификацией языка, главное чтобы не менялась семантика приложения, почему в дизассемблированном примере Stilet'а и могло получится разыменование раньше инкремента. Но с точки зрения языка, в данном случае, операции происходят в строгом порядке в соответствии с приоритетом операторов и порядком их исполнения (сначала постфиксный инкремент, затем разыменование возвращённого им значения, затем присваивание).
netrino вне форума Ответить с цитированием
Старый 15.02.2012, 08:21   #15
Inv1s
Форумчанин
 
Аватар для Inv1s
 
Регистрация: 06.11.2011
Сообщений: 214
По умолчанию

Если бы сначала выполнился постфиксный инкремент, то чем тогда он отличается от ++p?!
он выполниться последним, вначале разыменование, затем присваивание и затем уже постфиксный инкремент
Помог, нажми на весы
html, js, php, С++, С#, OpenGl, DirectX, XNA, HLSL
Inv1s вне форума Ответить с цитированием
Старый 15.02.2012, 08:36   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Blondy
Нет это Визуал Студио.
Код:
сначала постфиксный инкремент, затем разыменование возвращённого им значения, затем присваивание
Как-то не улавиваю логики - указатель сначала перескакивает на соседнюю ячейку, после чего в нее ложится значение? Ерунда какая-то...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.02.2012, 08:37   #17
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Такие операции есть. Самые простые примеры: сложение и вычитание имеют один приоритет. Как они выбираются? Выполняются в порядке записи слева направо.
Я тут маленько спутался с приоритетностью и ассоциативностью.
Вот из Архангельского.
Изображения
Тип файла: jpg assoc.jpg (69.2 Кб, 85 просмотров)
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 15.02.2012, 17:54   #18
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Код:
сначала постфиксный инкремент, затем разыменование возвращённого им значения, затем присваивание
Как-то не улавиваю логики - указатель сначала перескакивает на соседнюю ячейку, после чего в нее ложится значение? Ерунда какая-то...
Ну почему же ерунда, всё довольно логично. Таков способ работы постфиксного инкремента, он увеличивает значение переменной и возвращает её старое значение, как-то в примере
Код:
int x =5;
int y = x++;
std::cout << x << ' ' << y << std::endl;
// Выведет: 6 5
Также и здесь, сначала увеличивается ptr, возвращается при этом его старое значение, затем по этому значению мы присваиваем 0.
netrino вне форума Ответить с цитированием
Старый 15.02.2012, 20:16   #19
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
netrino
А-а-а я понял ход твоих мылсей... Постфиксник срабатывает первым, но его деяния "откладываются" до окончания обработки выражения, верно? Ну если филосовски рассуждать...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.02.2012, 21:55   #20
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А-а-а я понял ход твоих мылсей... Постфиксник срабатывает первым, но его деяния "откладываются" до окончания обработки выражения, верно?
Ну нет, не совсем. Деяния не откладываются, просто создаётся копия старого значения (во временной переменной). Постфиксный инкремент выглядел бы примерно так, в виде функции:
Код:
template <typename T>
inline T inc(T& var) {
  T oldValue = var;
  var = var + 1;
  return oldValue;
}
То есть создаётся дополнительная переменная, хранящая старое значение, которое и возвращается из ф-ции, в то время, как переменная, над которой производятся действия, получает новое значение. Естественно, в рассматриваемом случае, использования временной переменной можно избежать без изменения поведения, поэтому в сгенерированном коде, в результате оптимизаций, мы не наблюдаем ни временной переменной, ни правильной последовательности действий (сначала инкремент, потом разыменование).
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JMP DWORD PTR [PAddress] - как узнать адрес Enkee Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 03.11.2011 13:14