2012-05-01 2 views
0

아래 코드를 작성하면 어떻게됩니까?C 프로그래밍 언어의 연산자 우선 순위

int arr[] = {6, 7, 8, 9, 10}; 
int *ptr = arr; 
*(ptr++)+= 123; 

이제 arr []의 요소는 무엇입니까?

나는 원래 arr []가 {6, 130, 8, 9, 10}이되어야하지만 결과는 {129, 7, 8, 9, 10}입니다. 왜 그런지 모르겠습니다.

필자 의견으로는 ptr ++가 대괄호 안에 있으므로 우선 ptr이 증가해야합니다. 그렇지 않습니까? 증가 된 후에는 배열의 두 번째 요소를 가리켜 야합니다.

답변

5

ptr++값 (부작용이 발현 평가 동안 어떤 시점에서 ptr를 증분한다) 모든 전 ptr 증분 값이다.

이는 역 참조되는 값이 *(ptr++)입니다.

후속 표현에서 ptr을 참조 해제하면 다음 요소 인 값 7을 가리 킵니다.

4

기대하는 동작을 원하면 ++ptr (예 : 사전 증가)을 사용하십시오. 사후 증가가 발생할 때 때 괄호는 에 영향을주지 않습니다. 즉, 우선 순위와 관련이 없습니다.

0

PTR ++의 기본 의미는 포스트 증가 운영자로 알고있는 이유입니다 다음 먼저 사용 증가입니다. 이는 현재 명령어가 실행을 끝내고 그 변수가 후속 명령어에서 다시 사용될 때만 ptr 변수의 값이 업데이트됨을 의미합니다. ++ PTR인만을위한 반대가 적용하는 동안

먼저 증가는를 사용하고는 사전 증가 연산자로 알려져 있습니다.

+0

간단하게 보면 알 수 있습니다. 'ptr ++'은 값 ('ptr'의 원래 값)과 부작용 (증분)을 가지고 있습니다. 값이 사용될 때와 관련하여 부작용이 발생하는 경우 언어에 의해 지정되지 않습니다. – pmg

0

이 ptr ++의 효과는 ';' ptr ++는 ptr = ptr + 1과 같습니다. 그러나이 문장의 세미콜론 뒤에는 만 수행됩니다. 작업 중 ptr 값은 arr [0]입니다. * (ptr ++) + = 123; 하지만 그 문장 다음에 ptr은 arr [1]과 같습니다.

+1

선택한 ** 답 **을 선택하면 * "부작용은 표현식을 평가하는 동안"ptr "을 증가시키고 있습니다."*. "after"가 아니라 "during"에 유의하십시오. –