>백엔드 개발 >C++ >C와 C에서 `2[arr]`는 `arr[2]`와 같습니다: 교환 배열 액세스?

C와 C에서 `2[arr]`는 `arr[2]`와 같습니다: 교환 배열 액세스?

Susan Sarandon
Susan Sarandon원래의
2024-11-25 14:42:11798검색

Does `2[arr]` Equal `arr[2]` in C and C  : A Commutative Array Access?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.