Trong cpp, kết quả của đoạn mã sau là: 5 5 5 Nhưng trong java, kết quả của đoạn mã giống như sau: 3 5 7 Tôi không biết tại sao,
Vì C++ không phải là Java :)
Bạn đang biến đổi biến số v
trong hai lần gọi hàm cuối cùng. Chúng ta hãy nhìn vào dissassembly (debug vào đây để xem mọi thứ rõ ràng hơn, trong phiên bản một giá trị tĩnh của 5
được sử dụng, nhưng nó cũng có thể là 7
cũng giống như dễ dàng Bạn sẽ thấy lý do tại sao.):
h.fn(v).fn(v=5).fn((v=7));
00411565 mov dword ptr [v],7
0041156C mov dword ptr [v],5
00411573 mov eax,dword ptr [v]
00411576 push eax
Trình tự đánh giá biểu thức không được bảo đảm là thứ tự mà bạn gọi các hàm ở đây. Bạn đang sửa đổi v
giữa sequence points. 7
được gán cho v
, sau đó 5
, sau đó chức năng đầu tiên được gọi. Lưu ý rằng nó không phải là 7
và sau đó 5
theo thứ tự đó, nó có thể được đổi chỗ! Thứ tự đánh giá là không xác định, nó có thể là bất cứ điều gì.
Bạn có một chuỗi các chức năng làm biến đổi v
hai lần. Bạn không thể dựa vào thực tế là mỗi đột biến sẽ xảy ra theo thứ tự bạn đã gõ ở đây.
Chúng tôi có thể đơn giản hóa nó. Giả sử chúng ta có hai hàm; x
và y
cả hai đều trả lại int
. Nếu tôi viết:
int k = x() + y();
Không có gì bảo đảm rằng x()
sẽ được gọi trước khi y()
. Vì vậy, nếu bạn đang thay đổi một đối số chung cho cả hai hàm thì đột biến có thể xảy ra trong cuộc gọi đến số y()
trước tiên, đó là những gì bạn đang thấy.
Nguồn
2012-03-29 00:51:27
Câu trả lời ngắn gọn là "C++ không phải là Java". –
BTW, tôi yêu các câu hỏi cho phép tôi phá vỡ một số tháo gỡ. :) –