오늘 저는 Eric Lippert에 의해 십자가를 냈습니다. 여기서 그는 사업자 우선 순위와 평가 순서 사이의 신화를 없애려고했습니다. 내가 변수 값의 값을 생각하면
int [] arr = {0}; int 값 = arr [arr [0] ++]; 값 = 1?
int[] arr = {0};
int value = arr[arr[0]++];
지금, 나는 단순히 하나 그것을 계산 : 끝에서 나를 혼란있어이 개 코드 조각이 있었다, 여기에 첫 번째 조각이다. 어떻게 작동하는지 생각 해보자. 그 안에 하나 개의 항목 INT 의 배열로서
- 먼저 도착 선언; 이 항목의 값은 0입니다.
- 두 번째는 에 arr [0] --0의 값을 가져옵니다.
- 셋째 도착 (여전히 0) [공정 (2)의 값 ]의 값이 [0]이 0으로 다시 --still
- 네번째 단계의 값을 할당 도착을 얻을 --gets 3 (0)를 변수 값에 적용합니다. --value = 0 해주기
- 2 1 --Now 도착 [0] = 1
명백하게이 잘못 스텝의 값에 추가. 실제로 증가가 언제 발생하는지에 대한 명시적인 진술을 위해 C# 스펙을 검색하려고 시도했지만 아무 것도 찾지 못했습니다. 현재 이곳에
int[] data = { 11, 22, 33 };
int i = 1;
data[i++] = data[i] + 5;
나는이 프로그램이 배열을 선언하고 난에 1을 할당 --after 실행할 생각하는 방법은 다음과 같습니다
두 번째 조각은 주제에 에릭의 blog post의 코멘트에서입니다.
- 얻기 데이터 [PLZ 참아 [I]는 --1
- 는 단계 1 값 데이터 5 --6
- 할당 [I] (값 추가 단계의 또 1) 2 값 --data [내가] = 6
- 단위 I - I = 2
내 이해에 따르면,이 배열은 현재 값 {11 (27)를 포함한다, 33}. 그러나 배열 값을 인쇄하기 위해 반복했을 때 : {11, 38, 33}. 즉 게시 증가가 배열을 참조 해제하기 전에 발생했음을 의미합니다!
어째서? 이 게시물 증가가 게시물이 아닌가요? 즉 다른 모든 일 후에 발생합니다.
내가 뭘 놓친거야?
다섯 번째 단계로 명세서 생각해야하는 것은 어쨌든 올바르지 않습니다. "2 단계 1의 값에 더하기 - 이제 arr [0] = 1" 배열에서 가져 오거나 복사 한 값은 1 씩 증가하지만 ** 배열의 ** 값은 변경되지 않습니다. 따라서 구문 arr [0] = 1은 false입니다. 5 단계에서 arr [0] = 1로 복사 된 값. – Gertjan
그럼 코드를 실행하고 첫 번째 대답에는 0을, 두 번째에는 {11,27,33}의 값을 얻었습니다.이 문제는 컴파일러에 따라 다릅니다 ? – bubblegum
@Swabha 확실히 C#을 사용하고 있습니까? – Galilyou