Информация об изменениях

Сообщение Re: А вот не надо верить глазам своим :) от 10.11.2017 8:39

Изменено 10.11.2017 11:32 AleksandrN

Re: А вот не надо верить глазам своим :)
Здравствуйте, c-smile, Вы писали:

CS>
CS>int a = 2;
CS>printf("%d", ++a + ++a + ++a);
CS>


CS>
>> 13
CS>


CS>https://repl.it/OEEN/1


По выражению ++a + ++a + ++a компилятор, построит такое дерево разбора:
    +
   /   /   ++a(1) ++a(2)
                           +
                                 ++a(3)


и сгенерирует примерно такой код (x86):
inc a           ; a = 3 (1) в скобочках - порядковый номер инкремента в примере
inc a           ; a = 4 (2)
mov eax, a      ; a = 4, eax = 4 
add eax, a      ; a = 4, eax = 8
inc a           ; a = 5 (3), eax = 13
add eax, a      ; a = 5, eax = 13


Компилятор честно выполнил инкремент до сложения и складывал с результатами инкремента . Результат зависит от платформы, компилятора и от того, какие параметры оптимизации кода были указаны при компиляции. Не нужно писать в коде выражения ++a + ++a + ++a, если нет желания устраивать пляски с бубном для поиска непонятных ошибок.
Re: А вот не надо верить глазам своим :)
Здравствуйте, c-smile, Вы писали:

CS>
CS>int a = 2;
CS>printf("%d", ++a + ++a + ++a);
CS>


CS>
>> 13
CS>


CS>https://repl.it/OEEN/1


По выражению ++a + ++a + ++a компилятор, построит такое дерево разбора:
    +
   / \
  /   \
++a(1) ++a(2)
        \
         \
          +
           \
            \
          ++a(3)


и сгенерирует примерно такой код (x86):
inc a           ; a = 3 (1) в скобочках - порядковый номер инкремента в примере
inc a           ; a = 4 (2)
mov eax, a      ; a = 4, eax = 4 
add eax, a      ; a = 4, eax = 8
inc a           ; a = 5 (3), eax = 8
add eax, a      ; a = 5, eax = 13


Компилятор честно выполнил инкремент до сложения и складывал с результатами инкремента . Результат зависит от платформы, компилятора и от того, какие параметры оптимизации кода были указаны при компиляции. Не нужно писать в коде выражения ++a + ++a + ++a, если нет желания устраивать пляски с бубном для поиска непонятных ошибок.