2012-07-23 2 views
2

자바 스크립트에서 쇠사슬로 묶인 속기 연산자를 사용하여 스왑 함수를 작성하는 동안, 나는 많이 혼란에 빠져 들었다.왜 이러한 묶여있는 속기 연산자가 작동하지 않습니까?

이 코드는 a 및 b 값을 바꿔야합니다.

var a = 4532; 
var b = 969; 

a^=b^=a^=b; 

하지만 그렇지 않은 : 의도 한대로 B = 4532을,하지만 = 0

나는 2 선에서이 암호를 해독하면, 그것은 작동합니다.

var a = 4532; 
var b = 969; 

b^=a^=b; 
a^=b; 

기술적 인 설명은 무엇입니까?

추신 : 빠른 시일 내에 누군가를 시험해 보려면 the code on jsfiddle입니다.

답변

2

질문에 대답하기 전에 다음 코드의 결과를 알려주시겠습니까?

var c = 1; 
c += c += 1; 

당신은 스스로를 시도, 그것은 4 있다고 믿고 있습니다 :

내가 자바 스크립트 코드가 후드 아래에 해석 방법을 모른다. 여기 왜 그런 일이 일어 났는지 설명하려고 노력합니다.

a += ba = a + b과 같습니다. 따라서 c += c += 1c = c + (c = c + 1)입니다. 할당 형태가 (c + (c = c + 1)) 인 경우 결과는 (c + c + 1)입니다. 여기서 그것이 핵심 포인트라고 생각하고 혼란 스럽습니다. 변수 c은 여전히 ​​1입니다. 새 값 c + 1을 첫 번째 할당 c += 1에 재 할당합니다.

따라서 a^=b^=a^=ba = a^b^a^b과 같습니다. 즉, 0입니다. a의 내부 변경 사항이 무시되었거나 버그 일 수 있으십니까?

내 또 다른 추측은 코드는 다음과 같이 확장 될 수 있다는 것입니다 : 내가 VM에 의해 생성 된 바이트 코드처럼 보이는 방법을 모른다 원인, 내 모든 추측이다

c = 1 + (c = 1 + 1)// in form of c = c + (c = c + 1) 

. 희망은 그것이 유용합니다.