2016-07-21 14 views
11

Gần đây tôi đã kiểm tra mã nhỏ ngọt để hoán đổi hai biến bằng chức năng XOR. Tôi đã sử dụng JavaScript cho việc này.Tại sao các báo cáo này hoạt động khác trong JavaScript?

Cho x và y là hai biến và để x = 4, y = 6.

x = x^y; y = y^x; x = x^y;

Nó hoán đổi các biến độc đáo. Lưu ý rằng tôi đang giữ xy khác nhau để ngăn chặn việc tạo răng cưa có thể xảy ra do XOR đầu tiên.

Sau đó, quan sát báo cáo kết quả, tôi đã viết: x = x^(y = y^(x = x^y)); này hoán đổi biến y một cách chính xác nhưng làm x luôn 0.

Ngoài ra, x ^= y ^= x ^= y; cũng có vẻ là biểu thức tương đương mang lại kết quả không chính xác giống như trong trường hợp thứ hai.

Tuy nhiên, tất cả các câu lệnh này chạy tương đương trên Java và tạo ra kết quả tương tự nhất quán.

Tôi cũng đã sử dụng chế độ nghiêm ngặt với JavaScript.

Ba câu lệnh này không tương đương với JavaScript hay tôi thiếu thứ gì đó quan trọng ở đây?

+3

thử 'x = (y = y^(x = x^y))^x;' thay vào đó - bạn có x cần thay đổi trước khi đánh giá ... Người cuối cùng sẽ không hoạt động vì phần đầu tiên của 'x^'(tìm giá trị bắt đầu) được thực hiện trước khi x được gán lại. – dandavis

+0

trao đổi độc lập loại w/o nhiệt độ từ vựng: 'var x = 4, y = 6; x = [y, y = x] [0]; [x, y] ' – dandavis

+0

@ dandavis Giải pháp của bạn hoạt động như một sự quyến rũ. Cảm ơn. Tôi đã tìm thấy lỗi của mình. Tôi ngu ngốc. Một lần nữa xin cảm ơn. – Ozil

Trả lời

4
x = x^y; 
y = y^x; 
x = x^y; 

này hoạt động bởi vì nó giống như

x_1 = x_0^y_0; 
y_1 = y_0^x_1; 
x_2 = x_1^y_1; 

Sau đó,

x_final = x_2 = x_1^y_1 = x_0^y_0^y_0^x_1 = x_0^y_0^y_0^x_0^y_0 
     = y_0 
y_final = y_1 = y_0^x_1 = y_0^x_0^y_0 
     = x_0; 

bạn x = x^(y = y^(x = x^y)); là như

x_1 = x_0^y_0; 
y_1 = y_0^x_1; 
x_2 = x_0^y_1; 

Sau đó,

x_final = x_2 = x_0^y_1 = x_0^y_0^x_1 = x_0^y_0^x_0^y_0 
     = 0 
y_final = y_1 = y_0^x_1 = y_0^x_0^y_0 
     = x_0; 

Nó sẽ hoạt động nếu bạn sử dụng x = (y = y^(x = x^y))^x;.

Đó là vì JS phân tích các biểu thức từ trái sang phải và bạn muốn rằng x là giá trị được sửa đổi, không phải giá trị ban đầu.

+0

x^(y = y^(x = x^y)); không giống như (y = y^(x = x^y))^x; là tất cả những gì bạn muốn nói, phải không? – user1589188

+0

@ user1589188 Tóm lại, vâng – Oriol

Các vấn đề liên quan