2011-12-18 3 views
2

나는 다음과 같은 코드가 잘 실행 스 니펫을 가지고 이러한 코드 조각의 차이점은 무엇입니까?

char* head = str; 
char* tail = head; 
while (*tail) { 
    ++tail; 
} 

나는 단순화를 위해 while 루프를 변경하고 새 코드는
char* head = str; 
char* tail = head; 
while (*tail++); 

나는 위의 두 코드 조각은 같은 일을 생각합니다. 그러나 제 2의 것은한다! GDB에서는 32 자의 문자열에 대해 포인터 꼬리가 31보다 큰 33보다 큰 것을 알 수 있습니다.

저는 정말 당황 스럽습니다.

+2

표현식 (** tail ** 및 ** tail ++)의 ** 값 **이 동일하지만 ** 부작용 **이 다릅니다. – pmg

답변

6

두 번째 코드에서는 * tail이 0인지 여부에 상관없이 후행 증가가 발생합니다.

+0

감사합니다. 몇 년 동안 C 프로그래밍을 해왔지만, 가끔씩 이런 식으로 틈을 타십시오. –

0

*tail이 0이 아닌지 먼저 확인하고 0이 아닌 경우 tail을 증가시킵니다. 값이 0이면 tail을 증가시키기 전에 루프를 중지합니다.

두 번째 값은 tail으로 증가하고 이전 값인 tail0을 가리키는 지 확인합니다. 그렇지 않은 경우 계속 진행됩니다. 그렇다면 중지 될 것이지만 이미 증가 된 숫자는 tail입니다.

그래서 기본적으로 차이는 두 번째는 0 후 문자로 tail 가리키는 떠나있는 동안 첫 번째가하는 0tail 포인팅을 떠날 것입니다.

2

왜 좌절 했나요?

증분은 첫 번째 경우에는 조건부이고 두 번째 경우에는 조건부입니다.

두 번째 형식은 유용하지 않습니다 (종료 자로 돌아 가기 위해 감소해야하기 때문에).하지만 할당이 끝난 후 하나의 주소를 계산할 수 있기 때문에 괜찮습니다.

0

두 번째 경우에는 적용 할 조건을 제공해야합니다. 그렇지 않으면 부작용이 발생합니다.

마지막에 할 일을 던질 수 있습니까?

관련 문제