우선, Henk와 Olivier의 대답이 맞습니다. 조금 다른 방식으로 설명하고 싶습니다. 특히이 점을 말씀 드리고 싶습니다. 다음과 같은 문장이 있습니다.
int k = 10;
int c = 30;
k += c += k += c;
그런 다음이 명령문 세트와 동일한 결과를 제공해야한다고 잘못 결론을 내립니다.
int k = 10;
int c = 30;
k += c;
c += k;
k += c;
당신이 어떻게 잘못했는지, 그리고 그것을 올바르게하는 방법을 보는 것은 유익합니다. 그것을 분해하는 올바른 방법은 다음과 같습니다.
먼저 가장 바깥 쪽 + =를 다시 작성하십시오.
k = k + (c += k += c);
둘째, 가장 바깥 쪽 +를 다시 작성하십시오. x = y + z는 항상 "y를 임시로 평가하고, z를 임시로 평가하고, 임시를 합하고, 합계를 x에 할당"과 동일해야한다는 데 동의하기를 바랍니다 . 그래서 그것을 매우 명시 적으로 만들어 보겠습니다.
int t1 = k;
int t2 = (c += k += c);
k = t1 + t2;
이것은 당신이 잘못한 단계이기 때문에 명확하게 확인하십시오 . 복잡한 작업을 더 간단한 작업으로 나눌 때 천천히 조심스럽게 수행 하고 단계를 건너 뛰지 않도록해야합니다 . 단계를 건너 뛰는 것은 우리가 실수하는 곳입니다.
이제 t2에 대한 할당을 다시 천천히 조심스럽게 분해합니다.
int t1 = k;
int t2 = (c = c + (k += c));
k = t1 + t2;
할당은 c에 할당 된 것과 동일한 값을 t2에 할당하므로 다음과 같이 가정 해 보겠습니다.
int t1 = k;
int t2 = c + (k += c);
c = t2;
k = t1 + t2;
큰. 이제 두 번째 줄을 나눕니다.
int t1 = k;
int t3 = c;
int t4 = (k += c);
int t2 = t3 + t4;
c = t2;
k = t1 + t2;
좋습니다. 우리는 발전하고 있습니다. t4에 대한 할당을 분류합니다.
int t1 = k;
int t3 = c;
int t4 = (k = k + c);
int t2 = t3 + t4;
c = t2;
k = t1 + t2;
이제 세 번째 줄을 나눕니다.
int t1 = k;
int t3 = c;
int t4 = k + c;
k = t4;
int t2 = t3 + t4;
c = t2;
k = t1 + t2;
이제 우리는 모든 것을 볼 수 있습니다.
int k = 10;
int c = 30;
int t1 = k;
int t3 = c;
int t4 = k + c;
k = t4;
int t2 = t3 + t4;
c = t2;
k = t1 + t2;
완료되면 k는 80이고 c는 70입니다.
이제 이것이 IL에서 어떻게 구현되는지 살펴 보겠습니다.
int t1 = k;
int t3 = c;
is implemented as
ldloc.0
ldloc.1
이제 이것은 약간 까다 롭습니다.
int t4 = k + c;
k = t4;
is implemented as
ldloc.0
ldloc.1
add
dup
stloc.0
위의 내용을 다음과 같이 구현할 수 있습니다.
ldloc.0
ldloc.1
add
stloc.0
ldloc.0
그러나 "dup"트릭을 사용하면 코드가 짧아지고 지터가 더 쉬워지기 때문에 동일한 결과를 얻습니다. 일반적으로 C # 코드 생성기는 스택에서 가능한 한 임시를 "임시"로 유지하려고합니다. 일시적인 횟수를 줄 이면서 IL을 따르는 것이 더 쉽다면 최적화를 끄면 코드 생성기가 덜 공격적입니다.
이제 c를 얻기 위해 동일한 트릭을 수행해야합니다.
int t2 = t3 + t4;
c = t2;
is implemented as:
add
dup
stloc.1
그리고 마지막으로:
k = t1 + t2;
is implemented as
add
stloc.0
우리는 다른 것에 대한 합계가 필요하지 않기 때문에 그것을 복제하지 않습니다. 이제 스택이 비어 있으며 명령문의 끝입니다.
이야기의 교훈은 다음과 같습니다. 복잡한 프로그램을 이해하려고 할 때 항상 한 번에 하나씩 작업을 세분화하십시오 . 지름길을 사용하지 마십시오. 그들은 당신을 타락하게 할 것입니다.