Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Выражения с инкремента?

Ответить
Настройки темы
C/C++ - [решено] Выражения с инкремента?

Аватара для alex-dogg

Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: alex-dogg
Дата: 23-04-2013
Есть выражения с инкремент
выражение 1:
Код: Выделить весь код
int a = 2, c = 0;
c = (++a) +++a;
c = 6. ?
а = 4
--------------
выражение 2:
Код: Выделить весь код
int a = 2, c = 0;
c = ++a+(++a);
c = 8. ?
a = 4.
-----------
Я не могу понять почему компилятор дает такой ответ. (Visual Studio 2005).

читать дальше »
(вчера я прочитал в одной книге, что в С + + возможные ситуации когда инициализация и модификация переменной могут не со-падать во времени, и таких конструкций вообще нужно обходить стороной - возможно это и есть ответ на мой вопрос). но мне интересно почему так происходит?

Отправлено: 15:28, 23-04-2013

 

Аватара для deviance

Пользователь


Сообщения: 123
Благодарности: 43

Профиль | Отправить PM | Цитировать


alex-dogg,
Чудеса кодогенерации

Это результат дизассемблирования двух выражений:
1. c = (++a)+++a;
Код: Выделить весь код
mov     [ebp+a], 2      ; Инициализируем локальные переменные. a = 2;
mov     [ebp+c], 0      ; c = 0;
mov     eax, [ebp+a]    ; Кладем значение локальной переменной `a` в eax
add     eax, 1          ; Инкремент ( eax == 3 ) 
mov     [ebp+a], eax    ; Сохраняем полученное eax в `а` ( а == 3 )
mov     ecx, [ebp+a]    ; В есх кладем значение а ..
add     ecx, [ebp+a]    ; и складываем с самим собой.
mov     [ebp+c], ecx    ; Сохраняем полученное значение в переменную `с`
mov     edx, [ebp+a]    ; А вот это еще один инкремент `а`
add     edx, 1          ; ..
mov     [ebp+a], edx    ; ..
                        ; Но `а` уже не используется в вычислении `с`. Это мертвый код.
mov     esi, esp
mov     eax, [ebp+c]
push    eax
mov     ecx, [ebp+a]
push    ecx
push    offset Format   ; "a=%d c=%d\n"
call    ds:printf       ; На консоли будет показано: a=4 c=6
2. c = ++a+(++a);
Код: Выделить весь код
mov     [ebp+a], 2      ; a = 2;
mov     [ebp+c], 0      ; c = 0;
mov     eax, [ebp+a]    ; eax = a;
add     eax, 1          ; Инкремент `a`
mov     [ebp+a], eax    ; a == 3
mov     ecx, [ebp+a]    ;
add     ecx, 1          ; Еще один инкремент `a`
mov     [ebp+a], ecx    ; а == 4
mov     edx, [ebp+a]    ; 
add     edx, [ebp+a]    ; Сложение двух `a`
mov     [ebp+c], edx    ; с == 8
mov     esi, esp        ;
mov     eax, [ebp+c]    ;
push    eax
mov     ecx, [ebp+a]
push    ecx
push    offset Format   ; "a=%d c=%d\n"
call    ds:printf       ; На консоли будет показано: a=4 c=8
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:39, 23-04-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Выражения с инкремента?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено




 
Переход