Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Но для начала, НИКОГДА НЕ ПИШИТЕ ТАКОЙ КОД.
[x = 3] x += (x++)
[x = 4] x += 3
[x = 7]
Что, в каком-то ЯП x += n определено как x = n + x?
<?php
$x = 3;
$x += $x++;
echo $x;#include <stdio.h>
int main() {
int x = 3;
x += x++;
printf("%i\n", x);
return 0;
}
Dump of assembler code for function main:
0x0000000100000f00 <main+0>: push %rbp
0x0000000100000f01 <main+1>: mov %rsp,%rbp
0x0000000100000f04 <main+4>: sub $0x10,%rsp
0x0000000100000f08 <main+8>: lea 0x5f(%rip),%rdi # 0x100000f6e
0x0000000100000f0f <main+15>: movl $0x0,-0x4(%rbp)
0x0000000100000f16 <main+22>: movl $0x3,-0x8(%rbp) # x = 3
0x0000000100000f1d <main+29>: mov -0x8(%rbp),%eax # x (3) -> register EAX (3)
0x0000000100000f20 <main+32>: mov %eax,%ecx # register EAX (3) -> register ECX (3)
0x0000000100000f22 <main+34>: add $0x1,%ecx # register ECX (3) += 1 // register ECX (4)
0x0000000100000f28 <main+40>: mov %ecx,-0x8(%rbp) # register ECX (4) -> x (4)
0x0000000100000f2b <main+43>: mov -0x8(%rbp),%ecx # x (4) -> register ECX (4)
0x0000000100000f2e <main+46>: add %eax,%ecx # register ECX (4) += register EAX (3) // register ECX (7)
0x0000000100000f30 <main+48>: mov %ecx,-0x8(%rbp) # register ECX (7) -> x (7)
0x0000000100000f33 <main+51>: mov -0x8(%rbp),%esi
0x0000000100000f36 <main+54>: mov $0x0,%al
0x0000000100000f38 <main+56>: callq 0x100000f4e <dyld_stub_printf>
0x0000000100000f3d <main+61>: mov $0x0,%ecx
0x0000000100000f42 <main+66>: mov %eax,-0xc(%rbp)
0x0000000100000f45 <main+69>: mov %ecx,%eax
0x0000000100000f47 <main+71>: add $0x10,%rsp
0x0000000100000f4b <main+75>: pop %rbp
0x0000000100000f4c <main+76>: retq
Не пойму, почему x += n должно разворачиваться компилятором в x = x + n?
int x = 3;
x = x + x++;


temp1, потом посчитает правый узел сохранит его значение в переменную temp2, а потом сложит int x = temp1 + temp2; $ irb
2.0.0-p247 :001 > x=3
=> 3
2.0.0-p247 :002 > x += x++
2.0.0-p247 :003 > x
=> 9
x += x++