2016-08-29 12 views
0

* x = * x + 1;과 같은 것을 할 수있는 이유는 무엇인가 * x = * x ++; 어떤 영향을 미치지 않는 것 같습니까?C++ 포인터 증가시키기

코드 :

// Example program 
#include <iostream> 
#include <string> 

using namespace std; 

void doSomething(int *x, int *y) 
{ 
    *x = *x++; 
    *y = *y + 5; 
} 

int main() 
{ 
    int x = 4; 
    int y = 3; 
    doSomething(&x, &y); 
    cout << "x is now: " << x << endl; //outputs 4 
    cout << "y is now: " << y << endl; //outputs 8 
    return 0; 
} 
+2

당신은 "포인터를 증가"아니에요, 당신은 "일이 포인터가 가리키는 증가"하고 있습니다. –

+0

'++ * x'을 사용하면 어떨까요? –

+0

이것이 왜 투표를 거절하는지 잘 모르겠습니다. 나는이 비디오 옆에 따라 갔다 @ 31:25 위의 코드에 대한 참조입니다 : https://www.youtube.com/watch?v=Rxvv9krECNw – simon

답변

2

*x = *x+1; 

은 물론

*x = ++*x; 

처럼 쓸 수있는이 문장은 그냥 쓸 수

++*x; 
이 문장

*x = *x++; 

위한 6,

바와 같이 그것은

*x = *(x++); 

에 해당하고 이후 증가 연산자의 부작용은 서열화되어 있지 않기 때문에 문제가 정의되지 않았습니다.

+0

* x = ++ * x; 일했다. 고맙습니다. – simon

+0

'* x = ++ * x' 또한 UB입니다. –

+0

@OliverCharlesworth 틀렸어. –

2

접미사 연산자 ++dereference * 연산자보다 우선 순위가 높습니다. 문 *x = *x++;은 다음과 같이 실행됩니다. *x = (*(x++))

위에서 볼 수 있듯이 ++ 연산자가 먼저 실행되어 포인터가 가리키는 곳을 가리 킵니다. 거기에서 dereference 연산자가 실행됩니다. 당신이 x의 실제 값을 증가하려면 모든 표현이 operators precedence rule을 수행하기 때문에 단지 ++*x;

+1

'x ++ '의 표현식 결과는'x'의 원래 값입니다. –

-1

물품. 표에서 볼 수 있듯이

운영자 operator++ 당신은 더 나은 괄호로 코드를 따를 수 operator*

보다 더 높은 우선 순위를 가지고 있습니다 :

*x = *(x++); 
:

*x = *x++; 

에 해당

간단히 말해서, 포인터의 값을 증가시키고 너 뒤에있는 그것을 인용하십시오.

| x = 4 |  <---- &x 
| trash | 
| trash | 

당신은 메모리에 다음 셀을 가리키는 것입니다 포인터 증가 : 메모리에서

는이 같은 일이

| x = 4 |  
| trash |  <---- &x+1 
| trash | 

을 그리고 자체에 값을 할당을, 어쨌든 그것은 쓰레기입니다 .


미스-이해 유효한 도움이 될해야 괄호의 사용을 방지하기 위해 솔루션

.그와

수정 :

*x = ++(*x); 
+0

'* x = (* x) ++;'이제 다른 문제가 생겼습니다. '(* x) ++;는 어떨까요? –

+0

@BoPersson 너무 빨리 죄송합니다. –

+0

_ "포인터의 값을 증가시키고 역 참조 후"_. 그게 사실이야? 증분은 할당 전후에 발생할 수있는 부작용입니다. 제 이해는'x ++ ++ '는 항상'x'의 원래 위치를 역 참조하고,'x'는 다음 위치를 가리 키도록 움직일 것입니다. 그래서 결과는 정의되지 않았습니까? 어쩌면 쓰레기 위치가 4라는 값을 얻었 을까요? – wally