Sự thật phũ phàng là ntn: Vừa đọc vừa ghi, hay ghi nhiều lần vào một biến giữa hai sequence point thì compiler thích cho bằng mấy cũng được, là một trong những undefined (không xác định) behavior.
bạn có thể hiểu như này:
message in ra sẽ là “[1] [2]” với [1], [2] là value tương ứng.
thứ tự các value trong print là a++, a–. chúng không được tính toán ngay màsẽ được lần lượt đưa vào queue và có thứ tự tương ứng. a++, a–. sau khi đưa hết các value vào queue thì sẽ lấy lần lượt các giá trị ra để tính toán theo thứ tự ngược lại : a–, a++.
đi theo từng bước ta có:
a-- -> in ra giá trị của a(5) vào [2] trong message, sau đó a = 4,
a++ -> in ra giá trị của a(4) vào [1] trong message, sau đó a = 5;
=> message đầu sẽ là: “4 5”,
printf sau sẽ in ra giá trị của a là 5 thôi.
ps: nếu xuất hiện các value a, ++a, --a thì sẽ hơi khác một xíu.
VD:
int a = 5;
printf("%d %d %d %d %d", a++, ++a, a, a–, --a);
Theo luồng bên trên ta có message: “[1] [2] [3] [4] [5]”.
đi ngược lại thứ tự đưa vào của a++, ++a, a, a–, --a ta có:
–a -> a = 4, chưa in ra giá trị của a vào ô số 5 ngay,
a-- -> in giá trị của a vào ô số 4 (value = 4), sau đó a = 3.
a -> chưa in ra giá trị của a vào ô số 3 ngay, tiếp tục tính toán.
++a -> a = 4, chưa in a vào ô số 2 ngay mà tiếp tục tính toán.
a++ -> in ra a vào ô số 1 ( value = 4), sau đó a = 5;
Tất cả những vị trí mà có a, ++a, --a và in ra giá trị cuối cùng của a ( value = 5) sau khi tính toán xong.
Cuối cùng message thu được là: “4 5 5 4 5”.
Em giải thích hơi khó hiểu cũng như chém bừa, các bác nhẹ tay ném gạch ạ.