> 백엔드 개발 > C++ > 2[arr] = 5 C와 C에서 어설션을 컴파일하고 전달합니까?

2[arr] = 5 C와 C에서 어설션을 컴파일하고 전달합니까?

Mary-Kate Olsen
풀어 주다: 2024-12-03 07:17:10
원래의
260명이 탐색했습니다.

Does 2[arr] = 5 Compile and Pass Assertion in C and C  ?

C 및 C에서 인덱스[배열]로 배열 액세스

면접관이 가끔 실시하는 지식 테스트에서 다음 코드가 표시됩니다.

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

처음에는 2[arr] 표현식이 컴파일에 실패하는 것처럼 보일 수 있습니다. 정수를 배열 이름으로 사용하여 배열을 인덱싱하려는 것 같습니다. 그러나 이 예상치 못한 구문은 실제로 C와 C 모두에서 유효합니다.

이유를 이해하기 위해 이러한 언어에서 [] 연산자의 기술을 살펴보겠습니다.

C 및 C 배열 액세스 의미

C99 표준(6.5.2.1 단락 1)에 따르면 [] 연산자는 다음 형식의 인수를 기대합니다.

  • 객체에 대한 포인터 유형의 하나의 표현식
  • 정수 유형의 하나의 표현식
  • 동일한 유형의 결과 표현식 as the object

또한 같은 섹션의 단락 2에서는 E1[E2]가 다음과 동일하다고 설명합니다. (*((E1) (E2))). 이는 E1[E2] 표현식이 포인터 조작으로 해석될 수 있음을 나타냅니다.

  • E1은 배열의 초기 요소에 대한 포인터로 변환됩니다.
  • E2는 다음에 추가됩니다. 결과적으로 배열의 E2 번째 요소를 가리키는 새 포인터가 생성됩니다.
  • 결과 포인터를 역참조하면 선택한 배열의 값이 반환됩니다. element.

결정적으로 표준 내에서는 []에 대한 인수 순서가 정상이어야 한다는 요구 사항이 없습니다. 따라서 2[arr] 표현식은 (*((2) (arr)))와 동일하게 처리됩니다.

  • 정수인 2가 의 첫 번째 요소를 가리키는 포인터에 추가됩니다. arr.
  • 결과 포인터는 arr의 세 번째 요소를 가리킵니다.
  • 결과 포인터 역참조(예: arr[2])는 세 번째 요소에 값 5를 할당합니다.

따라서 예상대로 할당과 후속 어설션이 모두 성공합니다.

위 내용은 2[arr] = 5 C와 C에서 어설션을 컴파일하고 전달합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿