C에서 변수를 증가 시키거나 감소시키는 연산자는 두개가 있다. 증가연산자 ++는 1을 증가시키고 --는 1을 감소기킨다 변수를 증가시키기 위해 다음과 같이 ++를 자주 사용한다


if( c == '\n')

    ++nl;


특이한 것은 ++ 나 --는 변수 앞에도 쓸 수 있고 뒤에도 쓸 수 있다는 점이다. 단 ++n은 n이 사용되기 전에 증가시키고 n++는 사용후에 증가시킨다 만약 n이 5라면


x = n++;


에서는 x는 5가 되는데


x = ++n;


에서는 6이 된다


증가 연산자와 감소 연산자는 변수에만 사용될 수 있고 (i+j)++ 와같이 수식에 사용 할수 는 없다

반면에 다음과 같은 경우에는 앞에 붙이든 뒤에 붙이든 결과가 같다.


if( c == '\n')

    nl++;


그러나 특별히 어떤것을 써야 할 경우가 있다. 예를 들어 문자열 s중의 문자 c를 모두 제거하는 함수 squeeze(s,c)를 생각해 보자.


/* squeeze: delete all c from s  */


void squeeze(char s[],int c)

{

    int i, j;

    

    for(i=j=0;s[i] != '\0';i++)

        if(s[i] != c)

            s[j++] = s[i];

    s[j] = '\0';

    

}


c가 아닌것이 나타날때마다 현재의 j 위치로 복사되고 다음 문자를 준비하기 위해 j가 증가된다 이것은 다음과 같이 쓸수 있다.


if ( s[i] != c) {

    s[j] = s[i];

    j++;

}


비슷한 구조를 가진 것으로 제1장의 getline 함수가 있는데,


if ( c =='\n') {

    s[j] = c;

    ++i;

}


와 같이 압축된 형으로 고쳐쓸수 있다.


if (  c == '\n' ) {

   s[i++] = c;

}


세번째 예로 문자열 s의 끝에 문자열 t를 연결하는 함수 strcat(s,t)를 생각해 보자 strcat는 s에 연결된 것을 저장할 충분한 여유가 있다고 가정한다 strcat는 값을 리턴하지 않고 결과의 문자열에 대한 포인터를 리턴한다.


/* strcat : concatenate t to end of s; s must be big enough */


void strcat(char s[],char t[])

{

    int i,j;

    

    i=j=0;

    while (s[i] != '\0')               /* find end of s */

        i++;

    while((s[i++] = t[j++]) != '\0')   /* copy */

        ;

}


각문자가 t에서 s로 복사될 떄, 접두사 ++가 i와 j에 작용하여 다음 순환할 떄 적절한 위치에 있도록 한다.


예제 2-4 문자열 s2의 문자 중 문자열 s1에 있는 문자들을 지우는 squeeze(s1,s2)를 작성하라.


얘재 2-5 문자열 s1에서 문자열 s2에 있는 문자 중 하나가 나타나는지를 찾아서 처음 나타나는 것의 위치(s1내에서의 위치)를 리턴하고 없을 경우 -1을 리턴하는 함수 any(s1,s2)를 작성하라 (표준 라이브러리 함수 strpbrk는 같은 작용을 하고 단지 그 위치에 대한 포인터를 리턴한다.)