C 및 C에서 인덱스로 배열 액세스 [Array]: 교환적 호기심
면접관을 당황하게 만드는 수수께끼의 질문:
int arr[] = {1, 2, 3}; 2[arr] = 5; // Compiles? assert(arr[2] == 5); // Fails?
직관적으로 a[b]는 *(a로 번역됩니다. b) 그리고 덧셈은 교환 가능하므로 2[arr]는 *(2 arr)과 동일해야 합니다.
표준이 이를 뒷받침합니까?
실제로, C 및 C 표준은 이러한 동작을 보증합니다.
C 표준 (C99):
섹션 6.5.2.1, 단락 1:
표현식 중 하나는 "객체 유형에 대한 포인터" 유형을 갖고, 다른 표현식은 정수 유형을 가져야 하며, 결과에는 "type" 유형이 있습니다.
문단 2(강조 추가됨):
대괄호 [] 안의 표현식이 뒤따르는 후위 표현식은 배열 객체 요소의 아래 첨자 지정입니다. 첨자 연산자 []의 정의는 E1[E2]가 (*((E1) (E2)))와 동일하다는 것입니다. 이항 연산자에 적용되는 변환 규칙으로 인해 E1이 배열 객체(동일하게 배열 객체의 초기 요소에 대한 포인터)이고 E2가 정수인 경우 E1[E2]는 E1의 E2 번째 요소를 지정합니다. (0부터 계산).
결론
표준에서는 다음과 같이 명백하게 명시합니다. E1[E2]는 인수 순서에 관계없이 *(E1 E2)와 동일합니다. 따라서 2[arr]은 arr[2]와 동일한 결과를 산출하므로 눈썹을 치켜세우지 않고도 할당과 어설션이 모두 성공할 수 있습니다.
위 내용은 C와 C에서 `2[arr]`는 `arr[2]`와 같습니다: 교환 배열 액세스?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!