0

내가 감사하겠습니다 말한다 먼저 포인터 말한다 What is the difference between *myptr++ and *(myptr++) in C혼란 답변 :</p> <p><strong>1)</strong> : 하나는 * myptr ++ 증가는 다른 그들의 받아 답변 최근 두 질문은 당신이 me.Here이 명확 경우 * P ++ 역 참조 된 포인터 값

2)Yet another sequence point query: how does *p++ = getchar() work?

간결하고 쉽게 이해하는 첫 번째 질문에 대한 허용 대답은, 상태가 ++은 높은 우선 순위의 일이 있기 때문에 * 일 때 포인터 myptr에 대한 증분이 먼저 수행 된 다음 역 참조됩니다. 심지어 컴파일러에서 확인하고 확인했습니다.

몇 분 전에 게시 된 두 번째 질문에 대한 대답이 나에게 혼란을주었습니다.

분명히 말해서 *p++에 이전 주소 인 p이 역 참조됩니다. 나는 두 번째 질문의 최상위 답변의 정확성에 의문을 가질만한 근거가 거의 없지만 솔직히 사용자의 첫 번째 질문의 대답과 모순된다고 느낍니다 .. 두 번째 질문의 대답이 의미하는 바는 누구나 간단하고 단순한 영어로 설명 할 수 있습니까? *p++은 두 번째 질문에서 p의 이전 값을 역 참조합니다. 은 우선 순위가 더 높으므로 ++이 더 높은 우선 순위를 가지므로 먼저 증가해야합니다. 이전 주소는 어떻게 대체 될 수 있습니까? *p++ 감사합니다. 이해하기 쉽게 간결하고

+0

"첫 번째 질문 [...]에 대한 대답은 ++가 *보다 우선 순위가 높기 때문에 myptr 포인터에 대한 증가분이 먼저 완료된 다음 역 참조가됨을 나타냅니다. –

+0

@PascalCuoq'* myptr ++'에서'++'가 우선 순위가 더 높다면,'myptr'이 처음으로 증가하고 역 참조가 되겠습니까? –

+0

'x ++ '가 시퀀스 포인트 사이에 직접 둘러싸이지 않을 때 ('2 + 3 + * p + x ++'), **'x'가 증가 할 때를 알 수 없습니다. 우선 순위에 관계없이 이전 시퀀스 포인트와 다음 시퀀스 포인트 사이에 언제든지있을 수 있습니다. 그러나 동일한 시퀀스 포인트 사이의 다른 곳에서'x'에 쓰거나 읽는 것이 금지되어 있기 때문에 차이를 관찰 할 수 없습니다. –

답변

2

후위 증가 연산자는 참조 연산자보다 higher precedence을 가지고 있지만, 변수 후위 증가는 가변 종래에 증분 값을 반환한다.

*myptr++ 

따라서 증가 동작이 더 높은 우선 순위를 갖고 있지만,이 역 참조 myptr의 이전 값 증가에 의해 리턴 된 값에서 수행된다.

당신이 연결 한 첫 번째 질문에 대한 답변

그는 다른 질문에 대답 것, 잘못이 아니다. 때문에 두 경우 모두 증가 먼저 수행 한 다음 myptr의 이전 값 참조를 취소에서 *myptr++*(myptr++) 사이에는 차이가 없습니다

.

+0

고마워요. 내가 오랫동안 그리워했던 아주 중요한 뉘앙스를 분명히했습니다. –

1

첫 번째 질문에 대한 허용 대답은 상태가 ++*보다 우선 순위,

권리가 있기 때문이다. 맞아요.

포인터의 증가분이 먼저 수행 된 후 역 참조됩니다.

그런 말은하지 않습니다. 우선 순위는 하위 표현식의 그룹화를 결정하지만 평가 순서는 결정하지 않습니다. ++의 우선 순위는 간접 *의 우선 순위보다 높은 것을

*myptr++ 

*(myptr++) 

로 (물론 아닌 cource 코드 레벨에서) 정확히 동일 함을 말한다 이는 간접 지정이 결과에 적용된다는 것을 의미합니다.

myptr++ 

부 표현식은 이전 값이 myptr 인 반면, (*myptr)++은 증가 연산자를 myptr이 가리키는 위치에 적용합니다.

후위 증가의 결과는 매우

*myptr++ = something; 

*myptr = something; 
myptr++; 

것과 같은 효과를 가지며, 피연산자의 이전 값이면 myptr의 증가 된 값을 저장하는 부작용 발생은 미정이다. 간접 참조가 평가되기 전에 또는 컴파일러에 따라 달라질 수 있습니다.

+0

답변 해 주셔서 감사합니다 !! –

1

C 사양의 6.5.2.4 절에서는 후행 증가 및 감소 연산자에 대해 설명합니다. 그리고 두 번째 단락은 여러분의 질문에 대한 답변입니다.

postfix ++ 연산자의 결과는 피연산자의 값입니다. 부작용으로서 피연산자 개체의 값이 증가합니다 (즉, 적절한 유형의 값 1은 이 추가됨).
...
결과의 값 계산은 의 부작용 전에 피연산자의 저장된 값을 업데이트합니다.

따라서 *myptr++이 주어지면 ++ 부분의 우선 순위가 더 높습니다. 우선 순위만으로 결과를 독점적으로 결정할 수는 없습니다. 언어는 스펙을 통해이를 정의합니다. 이 경우 myptr 값이 반환되고 myptr의 "부작용"이 실행됩니다.