Сообщение Re: А вот не надо верить глазам своим :) от 10.11.2017 8:39
Изменено 10.11.2017 11:32 AleksandrN
Re: А вот не надо верить глазам своим :)
Здравствуйте, c-smile, Вы писали:
CS>
CS>
CS>https://repl.it/OEEN/1
По выражению ++a + ++a + ++a компилятор, построит такое дерево разбора:
и сгенерирует примерно такой код (x86):
Компилятор честно выполнил инкремент до сложения и складывал с результатами инкремента . Результат зависит от платформы, компилятора и от того, какие параметры оптимизации кода были указаны при компиляции. Не нужно писать в коде выражения ++a + ++a + ++a, если нет желания устраивать пляски с бубном для поиска непонятных ошибок.
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>
CS>https://repl.it/OEEN/1
По выражению ++a + ++a + ++a компилятор, построит такое дерево разбора:
и сгенерирует примерно такой код (x86):
Компилятор честно выполнил инкремент до сложения и складывал с результатами инкремента . Результат зависит от платформы, компилятора и от того, какие параметры оптимизации кода были указаны при компиляции. Не нужно писать в коде выражения ++a + ++a + ++a, если нет желания устраивать пляски с бубном для поиска непонятных ошибок.
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, если нет желания устраивать пляски с бубном для поиска непонятных ошибок.