prosource

C 및 C++에서 인덱스[어레이]로 어레이 액세스

probook 2023. 6. 7. 22:59
반응형

C 및 C++에서 인덱스[어레이]로 어레이 액세스

몇몇 면접관들이 어떤 이유로든 하기를 좋아하는 작은 속임수 질문이 있습니다.

int arr[] = {1, 2, 3};
2[arr] = 5; // does this line compile?
assert(arr[2] == 5); // does this assertion fail?

제가 이해하는 바로는a[b]로 변환됨*(a + b)그리고 덧셈은 교환적이기 때문에, 그들의 순서는 별로 중요하지 않습니다.2[a]정말로*(2 + a)그리고 그것은 잘 작동합니다.

이것이 C 및/또는 C++의 사양에 따라 작동하는 것이 보장됩니까?

예. 6.5.2.1 단락 1(C99 표준)은 다음과 같은 주장을 설명합니다.[]연산자:

표현식 중 하나는 "객체에 대한 포인터" 형식이어야 합니다.type다른 표현식은 정수형이어야 하며, 결과는 "형"을 가져야 합니다.type".

6.5.2.1 제2항(추가됨):

대괄호 안에 있는 식 뒤에 오는 postfix 식[]배열 개체의 요소에 대한 첨자 지정입니다.첨자 연산자의 정의는 와 동일합니다. 이진에 적용되는 변환 규칙 때문입니다.+연산자, 만약E1배열 개체(연속적으로 배열 개체의 초기 요소에 대한 포인터)입니다.E2정수입니다.E1[E2]를 지정합니다.E2의 -제1요소.E1(0부터 시작).

그것은 주장의 순서를 요구하는 어떤 것도 말하지 않습니다.[]제정신이 되도록

일반적으로2[a]와 동일합니다.a[2]그리고 이것은 C와 C++ 모두에서 동등하게 보장됩니다. 왜냐하면 당신이 말한 것처럼 그것은 다음과 같이 해석되기 때문입니다.*(2+a)또는*(a+2),각각 다음과 같다.더하기 연산자는 교환식이므로 두 형식은 동일합니다.

양식은 동일하지만 성스러운 모든 것(그리고 미래의 유지보수 프로그래머)을 위해 다른 양식보다 "a[2]"를 선호하십시오.

추신: 만약 인터뷰에서 이런 질문을 받는다면, C/C++ 커뮤니티를 대표하여 정확한 복수를 하고, 인터뷰 진행자에게 답변을 하기 위한 전제 조건으로 모든 삼각형 시퀀스를 나열하도록 요청해야 합니다.아마도 이것은 그/그녀가 미래에 그러한 (실제로 어떤 것이든 프로그래밍하는 것과 관련하여) 질문하는 것을 환멸시킬 것입니다.면접관이 실제로 9개의 삼각형 시퀀스를 모두 알고 있는 이상한 경우, 여러분은 가상 기본 클래스의 파괴 순서에 대한 질문으로 항상 그것들을 짓밟으려고 시도할 수 있습니다. 이 질문은 일상적인 프로그래밍과 매우 관련이 없는 질문입니다.

언급URL : https://stackoverflow.com/questions/5073350/accessing-arrays-by-indexarray-in-c-and-c

반응형