검색결과 리스트
글
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는 같은 작용을 하고 단지 그 위치에 대한 포인터를 리턴한다.)
'프로그래밍 > C' 카테고리의 다른 글
2.10 지정 연산자와 수식(Assignment Operators and Expressions) (0) | 2014.10.27 |
---|---|
2.9 비트 연산자(Bitwise Operators) (0) | 2014.10.27 |
2.7 형 변환(Type Conversions) (0) | 2014.10.27 |
2.6 관계 연산자와 논리 연산자(Relational and Logical Operators) (0) | 2014.10.27 |
2.5 산술 연산자(Arithmetic Operators) (0) | 2014.10.27 |
RECENT COMMENT