영어로 읽는 코딩

18 [C] 증감연산자

Increment and Decrement Operators

 

C provides two unusual operators for incrementing and decrementing variables. The increment operator ++ adds 1 to its operand, while the decrement operator -- subtracts 1. We have frequently used ++ to increment variables, as in

 

if (c == '\n’ )

++nl;

The unusual aspect is that ++ and -- may be used either as prefix operators (before the variable, as in ++n), or postfix (after the variable: n++). In both cases, the effect is to increment n. But the expression ++n increments n before its value is used, while n++ increments n after its value has been used. This means that in a context where the value is being used, not just the effect, ++n and n++ are different. If n is 5, then

 

x = n++;

sets x to 5, but

 

x = ++n;

sets x to 6. In both cases, n becomes 6. The increment and decrement operators can only be applied to variables; an expression like ( i + j ) + + is illegal.

 

In a context where no value is wanted, just the incrementing effect, as in

 

if (c == ’\n’)

nl++;

prefix and postfix are the same. But there are situations where one or the other is specifically called for. For instance, consider the function squeeze ( s, c ), which removes all occurrences of the character c from the string s.

 

/* squeeze: delete all c from s */

 

void sqeeze (char [], int c)

{

     int i, j;

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

            if (s[i] !=c)

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

     s[j] = '\0';

}

 

 Each time a non-c occurs, it is copied into the current j position, and only then

is j incremented to be ready for the next character. This is exactly equivalent

to

if (s[i] != c) {

   s[j] = s[i];

   j++;

}

 

Another example of a similar construction comes from the getline function that we wrote in Chapter 1, where we can replace

 

if (c == '\n') {

     s[i] = c;

     ++i;

}

 

 by the more compact

if (c == '\n')

     s[i++] = c;

 

As a third example, consider the standard function strcat (s, t), which concatenates the string t to the end of the string s. strcat assumes that there is enough space in s to hold the combination. As we have written it, strcat returns no value; the standard library version returns a pointer to the resulting string.

 

/* 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 to t */
		;
}

 As each character is copied from t to s, the postfix ++ is applied to both i and j to make sure that they are in position for the next pass through the loop.

 

 

[The C Programming Language p.47-48]

댓글

댓글 본문
작성자
비밀번호
버전 관리
Yoo Moon Il
현재 버전
선택 버전
graphittie 자세히 보기