2017-10-24 2 views
3

후위 증감 연산자가 개의 피연산자의을 반환한다는 것을 읽었습니다. 그 가정하면 사실, 어떻게 코드이 가능처럼?접미사가 증가 된 포인터에 할당

int arr[5]{}; 
int *p = arr; 
for (int i = 0; i != 5; ++i) 
    *p++ = i; 

내 생각 procees는

  1. 운영자 precendence에 따르면, *p가 먼저 평가받을 것입니다.
  2. 그러면 postfix increment가 값을 증가시키고과 같이 객체 사본을 으로 반환합니다.
  3. 그러면 rvalues가 할당 연산자의 왼쪽에 있어서는 안되기 때문에 혼란 스럽습니다 ... 그럼 내 질문은 기본적으로 : *p++ = i;은 어떻게 가능합니까?

답변

1

운용자 precendence에 따르면 *p 먼저 평가받을 것이다.

당신은 틀린 말입니다. documentation에 따르면 증분이 먼저 평가됩니다. 이 경우 선행 값 (즉, 포인터가 증가하기 전의 값)이 산출되며, 역 참조가 된 후 왼쪽 값에 할당 할 수 있습니다.

+0

물론. 도트 연산자와 참조 취소 연산자가 섞여 있습니다. 지금 바보 같이 보인다. 감사. –

+0

좋은 답변 Jodocus, 나보다 1 분 일찍! @ ZylonD.Lite, 그의 대답을 받아들이는 것을 잊지 마라. – gsamaras

+1

물론! 끝난. –

2

연산자 우선 순위에 따라 * p가 먼저 평가됩니다.

틀린. 여기

:

*p++ 

증가가 *p을 먼저 평가 아닌 것이다.

이 값은 rvalue (포인터의 값)이며, 역 참조 후에는 i에 지정할 수있는 lvalue가됩니다.

이에 루프 당신을 다시 작성할 수 :

for (int i = 0; i != 5; ++i) { 
    std::cout << *p << std::endl; 
    *p++ = i; 
    std::cout << *p << std::endl; 
} 

더 나은보기를 얻을 수 있습니다.

+0

그래, 내 잘못. 긴 밤. 감사. –

관련 문제