Bạn không nên dựa vào mã như vậy để làm việc vì nó dựa trên thực tế là nó được xử lý từ trái sang phải.
Bất kỳ triển khai nào không thực hiện như vậy sẽ làm cho lỗi không thành công. Bạn nên tránh viết mã không hoạt động trong mọi trường hợp trên tất cả các nền tảng và không phải là trình biên dịch độc lập, hoặc dựa vào những thứ không được ghi chép cũng như không được xác định rõ.
Vậy tại sao nó hoạt động nếu bạn đi từ trái sang phải: Giả sử A = 1 và B = 3
A = A + B - (B = A);
A = 1 + 3 - (1) = 3
Việc gán B xảy ra khi tôi rời() Điểm mấu chốt là chỉ khi xử lý từ trái sang phải, việc gán B đến A sẽ diễn ra sau.
Khi xử lý từ phải sang trái cùng ví dụ: A = A + B - (B = A);
A = 1 + 1 - (1) = 1
Bây giờ, việc gán B đang diễn ra trước.
Một lần nữa, bạn không nên dựa vào mã không rõ ràng cho người đọc những gì đang xảy ra, và đó là trình biên dịch phụ thuộc mà đây là trường hợp ở đây.
Nguồn
2015-08-01 06:50:50
Nó hoạt động trùng hợp trên nhiều triển khai, tuy nhiên, hành vi của mã này không được xác định theo tiêu chuẩn. – Marian
Hơn nữa, nó chỉ ẩn biến tạm thời trong phần 'B = A'. Nó không thực sự đơn giản hóa bất cứ điều gì. IMHO nó làm xấu đi khả năng đọc của mã. –
Liên quan: [Tại sao biểu thức a = a + b - (b = a) đưa ra cảnh báo điểm chuỗi trong C++?] (Http: // stackoverflow.com/questions/13317684/why-do-the-expression-aabba-give-a-sequence-point-cảnh báo-in-c), [Tại sao a = (a + b) - (b = a) là lựa chọn không hợp lệ để hoán đổi hai số nguyên?] (http://stackoverflow.com/questions/20800684/why-is-a-ab-baa-bad-choice-for-swapping-two-integers). –