while(*s++ = *t++) 을 이해 못하면 미신에 기반한 프로그래밍을 하는 것이다

버들비·2020년 12월 12일
1

Joel Spolsky 의 조언(원문, 번역본)에 따르면 while(*s++ = *t++) 은 c 언어의 문자열 복사 루틴이고, 이걸 이해못하면 컴퓨터과학을 잘못 배운거란다.

문자열을 복사하는 루틴의 코드는 다음과 같다.

void strcpy(char *dst, char *src) {
	while(*dst++ = *src++)
    }

src (source)에 있는 문자열을 dst (destination)에 복사하는 루틴이다.

background

c언어에서 포인터

포인터 변수는 값의 주소를 갖고 있다. *는 참조 연산자로, 해당 포인터 주소값에 해당하는 값을 참조한다.

c언어에서 문자열과 메모리

c언어에서 문자열은 배열 형태로 저장되는데, 각 문자별로 메모리 공간상에 연속된 주소값을 가지게 된다.

src에 "hello" 라는 문자열이 저장돼 있다고 하자

char src[6] = "hello"; 

(c언어 문자열의 마지막에는 null 문자(\0)가 반드시 들어가야 하기에, 실제 문자 갯수보다 하나 많은 배열로 선언해 줘야한다.)

이때 h라는 문자의 메모리 주소가 1000이라면, e는 1001, l은 1002, l은 1003, o 는 1004 에 저장되는 셈이다.

c언어에서 연산자 우선순위

c언어의 증감 연산자 ++ 는 연산자가 변수 앞에 붙느냐 뒤에 붙느냐에 따라 차이가 발생한다.
증감 연산자가 변수 앞에 붙으면 변수가 증가한뒤 대입되고, 변수 뒤에 붙으면 대입된 다음 변수가 증가한다.

int a = 1
int b = 2
a = b++ // a는 1, b는 3
int a = 1
int b = 2
a = ++b // a는 2, b는 3

while(*dst++ = *src++)

char *src = "hello";

먼저 hello 라는 문자열 배열의 주소값을 *src 라는 포인터 변수에 저장한다.

증감연산자 ++이 변수 뒤에 붙어있으므로, 먼저 대입이 이뤄진 후 변수의 값이 증가한다.

c언어에서 대입연산자(=)는 값을 반환한다. 즉, *dst++ = *src++ 은 true 를 반환하므로, while 내부에 있으면 while 문이 계속 돌아간다.

  1. *src배열의 첫번째 값이 *dst 에 대입되고(h가 복사되고)
  2. src와 dst 의 값이 증감 연산자로 1씩 증가하고(증가하는건 문자열이 아니라, 문자열이 저장된 주소값이 증가한다)
  3. 첫번째 값의 바로 옆 주소에는 다음 문자열이 저장되어 있으니
  4. h 다음의 문자열인 e 가 dst 로 복사된다.
  5. null 문자는 false 이므로, 문자열의 마지막자리에 있는 null 문자(\0)를 만날때까지 while 문이 반복된다.

0개의 댓글