2014-12-13 5 views
1

최근 나는 C와 포인터를 배웠습니다.후행 증가 포인터가있는 문자 복사

스티븐 고칸 (Stephen G. Kochan)의 C 프로그래밍 (Programming in C)에서 나는 그것을 완전히 이해하는 데 어려움이있는 모범을 만났습니다.

포인터를 사용하여 문자열 to에 문자열 from을 복사하려면 예를 나타냅니다 :

나의 이해에서

void copyString (char *to, char *from) { 
    while (*from) 
     *to++ = *from++; 

    *to = '\0'; 
} 

*from++*from의 후행 증가이다; 따라서 *to++의 값은 *from이어야합니다.

`*from` is in the position 1. 

`*from++` is in position 2 

`*to++` in position 2, 

그러나 경우 예를 들어

이 : *from++ = *to++*to 위치 1이 아닌 2

으로 *from의 값을 반환해야 컴파일러는이 위치 2 말했습니다,이 책은 또한 위치 2 말했습니다.

나는 조금 혼란스러워. 이 사건에 대해 실현 가능한 설명이 있습니까?

+0

이는 다음과 같습니다.'* to = * from; ~ ++; ++에서 .- 끔찍한가요? –

+2

K & R 방법은 더 짧습니다. 'while (* to ++ = * from ++) {;}' – wildplasser

답변

5

단락 연산자 ++ 단항 연산자를 사용하는 경우 증분은 피연산자 값 계산 후 순서가 지정됩니다. 하여 예에서

*to = *from; 
to++ ; 
from++ ; 

: 그래서 식 동등 *to++ = *from++;, *to*from의 값이 얻어진다 다음 *from의 값은 다음 두 포인터 증가되고, *to 할당된다.

1

*to++ = *from++;tofrom에는 모두 포스트가 증가합니다.

당신이 좋아하는 읽을 수

  1. 이 (가) *fromto 증가
  2. *tofrom의 포함 복사합니다.

할당 연산자 =의 평가가 완료되면 후위 연산자가 계산되고 증분 (감소) 연산이 수행됩니다. 먼저 값이 복사되고 두 포인터가 모두 증가합니다.

+0

고맙습니다. 다음과 같이 sth를 읽습니다. 1.'from from '의 증분 2.'* to'에서'* from1'까지 값을 전달하십시오. 3.'* to'의 증분 – ctn

+0

@ctn no, 그것은 순서가 아닙니다. 두 포인터는 동시에 증가합니다. –

+1

"* 후위 연산자는 일단 할당 연산자 =가 끝나면 평가됩니다. *"이것은 올바르지 않습니다. postifx 연산자를 계산 한 결과가 피연산자입니다. 피연산자 증가는 평가의 부작용이며 피연산자에 대한 계산이 완료된 후 순서가 정해집니다. C11 표준 6.5.2.4/2 및 * 2501 *의 응답 참조 : http://stackoverflow.com/a/27460162/694576 – alk

0

이전 답변에 대한 설명입니다.

C에서 접미어 증분 ++은 역 참조 연산자 *보다 우선 순위가 높으므로 * ptr ++는 * (ptr ++)와 같습니다. C의 연산자 우선 순위에 대한 자세한 내용은 this을 확인하십시오.

+0

"* 이전 anwser *", 제발? – alk

+0

@alk. 이전의 모든 대답은 평범한 방법으로'* from ++ '이하는 것을 설명합니다. 나는 이것을 추상적 인 방식으로 설명하려고 노력하고있다 (나는 연산자 우선 순위를 의미한다). – D3Hunter