Joel Spolsky 의 조언(원문, 번역본)에 따르면 while(*s++ = *t++) 은 c 언어의 문자열 복사 루틴이고, 이걸 이해못하면 컴퓨터과학을 잘못 배운거란다.
문자열을 복사하는 루틴의 코드는 다음과 같다.
void strcpy(char *dst, char *src) {
while(*dst++ = *src++)
}
src (source)에 있는 문자열을 dst (destination)에 복사하는 루틴이다.
포인터 변수는 값의 주소를 갖고 있다. *는 참조 연산자로, 해당 포인터 주소값에 해당하는 값을 참조한다.
c언어에서 문자열은 배열 형태로 저장되는데, 각 문자별로 메모리 공간상에 연속된 주소값을 가지게 된다.
src에 "hello" 라는 문자열이 저장돼 있다고 하자
char src[6] = "hello";
(c언어 문자열의 마지막에는 null 문자(\0)가 반드시 들어가야 하기에, 실제 문자 갯수보다 하나 많은 배열로 선언해 줘야한다.)
이때 h라는 문자의 메모리 주소가 1000이라면, e는 1001, l은 1002, l은 1003, o 는 1004 에 저장되는 셈이다.
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
char *src = "hello";
먼저 hello 라는 문자열 배열의 주소값을 *src 라는 포인터 변수에 저장한다.
증감연산자 ++이 변수 뒤에 붙어있으므로, 먼저 대입이 이뤄진 후 변수의 값이 증가한다.
c언어에서 대입연산자(=)는 값을 반환한다. 즉, *dst++ = *src++ 은 true 를 반환하므로, while 내부에 있으면 while 문이 계속 돌아간다.