c - 연산 - 배열++




p가(int) 인덱스를 가리킬 때 '-1 (4)

이 질문에는 이미 답변이 있습니다.

오늘 나는 나를 위해 새로운 놀라움을주는 C 수수께끼를 우연히 발견했다.

아래 예제에서 -1 [p]가 컴파일 될 것이라고 생각하지는 않았지만 그렇게했습니다. 실제로 x는 -3이됩니다.

    int x;
    int array[] = {1, 2, 3};
    int *p = &array[1];
    x = -1[p]

인터넷에서 -1 [포인터]와 같은 것을 검색했지만 아무것도 찾지 못했습니다. 네, 올바른 검색어를 입력하기가 어렵습니다. -1 [p]가 컴파일되고 X가 -3이되는 이유를 누가 알 수 있습니까?


C 표준 (6.5.2 Postfix 연산자)에 따르면 아래 첨자 연산자는 다음과 같이 정의됩니다.

postfix-expression [ expression ]

따라서 대괄호 앞에는 접미사 표현이 있어야합니다.

이 표현에서

x = -1[p];

접미사 표현식 1 (즉, 기본 표현식), 접미사 표현식 1[p] (아래 첨자 연산자) 및 단항 연산자가 사용됩니다 - 컴파일러가 프로그램을 토큰으로 분할 할 때 정수 상수는 빼기없이 토큰 자체로 간주됩니다. 빼기는 별도의 토큰입니다.

따라서 진술은 다음과 같이 다시 작성할 수 있습니다

x = -( 1[p] );

접미사 표현식이 단항 표현식보다 우선 순위가 높기 때문입니다.

처음에 접미사 하위 표현식 1[p] 고려해 봅시다 1[p]

C 표준 (6.5.2.1 배열 첨자)에 따름

2 접미사 표현식과 대괄호 []로 묶인 표현식은 배열 객체의 요소를 첨자로 지정합니다. 아래 첨자 연산자 []의 정의는 E1 [E2]가 (* ((E1) + (E2)))와 동일하다는 것입니다. 이진 + 연산자에 적용되는 변환 규칙으로 인해 E1이 배열 개체 (동일하게 배열 개체의 초기 요소에 대한 포인터)이고 E2가 정수이면 E1 [E2]는 E2 번째 요소를 지정합니다. E1 (0부터 계산)

따라서이 하위 표현식은 *( ( 1 ) + ( p ) ) 처럼 평가되며 *( ( p ) + ( 1 ) ).

따라서 위의 진술

x = -1[p];

에 해당

x = -p[1];

포인터 p 가 명령문으로 인해 배열의 두 번째 요소를 가리 키기 때문에 -3 을 산출합니다.

int *p = &array[1];

그런 다음 p[1] 표현식은 배열의 두 번째 요소 다음의 요소 값을 산출합니다. 그런 다음 단항 연산자 - 가 적용됩니다.


가장 먼저 알아 두어야 할 것이 우선 순위입니다. 즉, [] 는 단항 연산자보다 우선 순위가 높으므로 -1[p](-1)[p] 아니라 -(1[p]) 와 같습니다. 그래서 우리는 1[p] 의 결과를 취하고 그것을 부정하고 있습니다.

x[y]*(x+y) 와 같으므로 1[p]*(1+p) 와 같고 *(p+1) 과 같으며 p[1] 과 같습니다.

따라서 우리는 p 가리키는 곳에서 요소를 하나씩 가져 와서 array 의 세 번째 요소, 즉 3을 취한 다음 무시하여 -3 을 얻습니다.


int array[] = {1, 2, 3};

~처럼 보인다

array[0]   array[1]  array[2]
 --------------------------
|     1   |    2    |   3  | 
 --------------------------
 0x100     0x104     0x108   <-- lets assume 0x100 is base address of array
array

다음에 당신이 좋아할 때

int *p = &array[1];

정수 포인터 parray[1] 주소, 즉 0x104 가리 킵니다. 마치

array[0]   array[1]  array[2]
 --------------------------
|     1   |    2    |   3  | 
 --------------------------
 0x100     0x104     0x108   <-- lets assume 0x100 is base address of array
             |
            p holds 0x104

그리고 당신이 좋아할 때

x = -1[p]

-1[p]-(1[p])-(p[1]) . 그것은 보인다

-(p[1]) ==> -(*(p + 1*4)) /* p holds points to array[1] i.e 0x104 */
        ==> -(*(0x104 + 4))
        ==> -(*(0x108)) ==> value at 0x108 is 3
        ==> prints -3

이 "수수께끼"를 만든 사람입니다 ( 내 트위터 게시물 참조)

그래서! -1 [p]는 무슨 일입니까?

ISO C는 실제로 []를 대칭으로 정의합니다. 즉, x[y]y[x] 와 동일합니다. 여기서 x와 y는 모두 표현식입니다.

순진하게, 우리는 -1[p]p[-1] 이므로 x = 1 이라는 결론으로 ​​넘어갈 수 있지만, -1은 실제로 상수 1에 적용된 단항 마이너스 연산자이고 단항 마이너스는 우선 순위가 낮습니다 []보다

따라서 -1[p]-(p[1]) 이므로 -3이됩니다.

이것은 다음과 같이 펑키하게 보이는 스 니펫으로 이어질 수 있습니다.

sizeof(char)["abc"] /* yields 'b' */





postfix-operator