2010-12-12 3 views
3
#include <iostream> 
using namespace std; 

int main() { 
    int value = 1, *pointer; 
    pointer = &value; 
    cout << *pointer++ << endl; 
    cout << *pointer << endl; 
} 

++ 연산자가 value으로 증가하지 않는 이유는 무엇입니까?C++에서 "* pointer ++"표현식은 어떻게 작동합니까?

+0

FAQ 여야합니까? –

+1

@the_drow : 나는 그렇게 생각하지 않는다. 잘 쓰여진 코드는 여기에 괄호를 사용하여 컴파일러와 다른 프로그래머 모두에게 명확한 의도를 전달합니다. –

+0

이 문제는 이미 comp.lang.c FAQ에 있습니다. 내 대답에 대한 링크를 참조하십시오. – NPE

답변

2

그것은 포인터가 보유하고있는 주소, 다음 그것을 역 참조를 증가한다는 점에서

*(pointer++) 

을하고 같은 것입니다.

+0

그리고 그것이 쓰여 져야하는 방법이기도하므로 혼란이 없다. –

+2

@Ben : 아마도,하지만 논쟁의 여지가 있습니다. 'a * b + c'를'(a * b) + c '라고 쓰는 것도 권할 것입니까? 또는 우선 순위 규칙을 알기 위해 유능한 프로그래머에게 의존하고 싶습니까? –

+2

@ 스튜어트 : 내 코드를 읽는 사람이 언어에 상관없이 우선 순위 규칙을 알고 있다고 기대합니다. 꽤 많이 수학적 우위를 의미합니다. –

3

++*보다 우선 순위가 높으므로 표현식은 *(pointer++)과 같으므로 값을 역 참조 한 다음 값이 아닌 포인터를 증가시킵니다. 값을 증가 시키려면 (*pointer)++을 수행해야합니다.

+0

값은 (후) 증가 전에 가리키는 값입니다. 포인터를 증가시키지 않고 가리키는 새 값을 반환합니다. –

+1

@Stuart Golodetz : 죄송합니다. – casablanca

1

*pointer++*(pointer++)을 의미합니다.

즉, 포인터가 아니라 포인터를 증가시킵니다.

원문 : K & R "The C Programming Language"를 읽는 것을 기억하십시오. 예를 들어 strcpy이이를 사용합니다.

어쨌든 우선 순위를 기억하는 방법입니다.

포인터를 증가시키기 때문에 두 번째 역 참조에는 정의되지 않은 동작이 있습니다.

환호 & HTH.,

0

당신은 포인터의 값을 증가하고는 값이 아닌, 그것에 의해 지적했다.

7

좋아, 모두 매개 변수의 바인딩을 설명했다.
그러나 아무도 그것이 의미하는 바를 언급하지 않았습니다.

int date[1,2,3,4,5]; 

int* pointer = data; 

std::cout << *pointer++ << std::endl; 
std::cout << *pointer << std::endl; 

위에서 언급 한 바와 같이 ++ 연산자는 우선 순위가 높으므로 * 연산자보다 엄격하게 바인딩됩니다. 표현식도 동일합니다 :

std::cout << *(pointer++) << std::endl; 
std::cout << *pointer << std::endl; 

연산자 ++는 후위 버전입니다. 즉, 포인터가 증가하지만 연산 결과는 * 연산자에서 사용할 원래 값을 반환합니다. 따라서 다음과 같이 명령문을 수정할 수 있습니다.

std::cout << *pointer << std::endl; 
pointer++; 
std::cout << *pointer << std::endl; 

출력 결과는 현재 가리키는 정수이지만 포인터도 증가합니다. 따라서 인쇄 된 값은 1\n2\n이 아니고 2\n\3\n이 아닙니다.