본문 바로가기

2010


글: 정재준 (rgbi3307@nate.com ) / 커널연구회(www.kernel.bz)   2010-12-06


연재순서

1. C언어 소개
2. 형태, 연산자, 표현
3. 제어 흐름
4. 함수와 프로그램 구조
5. 포인터와 배열
6. 구조체
7. 알고리즘 소개
8. 소팅을 통한 알고리즘 분석
9. 스택(Stack) 실습
10. 큐(Queue) 실습
11. 리스트(List) 실습
12. 트리(Tree) 실습
13. 해싱(Hash) 실습
14. 알고리즘 설계 및 분석기법
15. 진보된 알고리즘 소개

이 번 연재에서는 C언어의 변수명, 데이터 타입(data type)과 크기, 상수, 선언, 산술 연산자들, 관계와 논리 연산자들, 형변환, 증감 연산자, 비트단위 연산자들, 할당 연산자와 표현, 조건 표현, 연산 순위에 관하여 기술한다. 변수(Variables)와 상수(Constants)는 프로그램에서 사용되는 기본적인 데이터 표현방식이다.

선언 (Declaration)은 사용할 변수들을 나열하면서 변수의 형태(type)와 변수안의 초기값을 결정한다. 연산자(Operator)는 위에서 선언한 변수들에 대해서 무엇을 할지 지정한다. 표현(Expression)을 통하여 변수들과 상수들이 조합되어 새로운 값을 산출한다. 이때, 표현 대상(object)에 저장되어 있는 값과 연산되어 산출되는 값은 변수 형태(type)에 의해서 결정된다.

예를 들면, 다음과 같이 변수(a, b, c)와 상수(10, 20)를 선언하고 연산자식을 표현한다.

a = 10;   //변수 선언
b = 20;    //변수 선언
c = a + b - 10;    //연산자식 표현

표 현대상의 형태(type)는 그동안 표준화 되어왔으며 여러가지 종류가 있다. 예를 들면, 부호 있는(signed) 정수와 부호 없는(unsigned) 정수, 부호 없는 상수와 16진수 문자 상수, 실수형(floating-point), long double형, 문자열 상수 등이 있다. 이번장은 이들의 사용법에 대하여 기술한다.

변수명

변 수명과 기호상수를 정의할 때 몇 가지 규칙이 있다. 변수명은 문자와 숫자의 조합으로 만들고 첫 번째 문자는 반드시 영문자이어야 한다. underscore(_)는 문자로 처리되므로 길이가 긴 변수명의 판독성을 높이는데 유용하다. C언어의 라이브러리 루틴에서 underscore(_)로 시작하는 변수명을 자주 사용한다. 대문자와 소문자는 서로 구분되므로 a와 A는 서로 다르다. C언어의 관례상 소문자는 변수명으로, 대문자는 기호 상수로 사용한다. C언어 키워드(if, else, for, while, break, int, char, float 등)는 C언어 자신이 사용하는 것으로 이미 정해져 있기 때문에 변수명으로 사용할 수 없다.

C언어 키워드(32개)


변수의 명칭은 변수의 사용 목적에 따라서 이름짓는 것이 올바른 방법이다. 지역 변수나 루프의 인덱스 변수는 짧은 명칭을 사용하고 외부 변수는 좀더 긴 명칭을 사용하는 경향이 있다.

데이터 타입(data type)과 크기



short와 long은 아래와 같이 int와 double에 붙일 수 있다.

short int (int는 생략가능)
long int (int는 생략가능)
long double

int 는 현재 C언어가 실행되는 머신에서 정수를 표현하는 크기이다. short는 보통 16비트 크기이고,  int는 16비트, 32비트 혹은 64비트일 수 있다. C언어 컴파일러는 머신의 하드웨어에 따라서 적절한 크기를 선택한다. 제약조건은 short와 int는 적어도 16비트 크기이고, long은 적어도 32비트 크기라는 것이다. 그리고 short는 int 보다 크지 않고 int는 long 보다 크지 않다.

char, short, int, long앞에 signed나 unsigned를 붙일 수 있다. unsigned 숫자는 항상 양수이거나 영이다. 데이터 타입 안에 데이터를 표현할 수 있는 개수는 2의n승(n은 비트수)으로 계산된다.  예를 들어, 8비트 문자형의 데이터 타입인 char는 unsigned인 경우에는 0에서 255개의 값을 표현할 수 있고, signed인 경우에는 -128에서 127개의 값(2의 보수 머신에서)을 표현할 수 있다.  문자를 signed 혹은 unsigned로 나타내는 것은 머신에 따라서 다르며, 인쇄할 수 있는 문자는 항상 양수이다.

long double 데이터 타입은 확장밀도(extended-precision) 실수를 표현한다. 정수형과 마찬가지로 실수형도 머신의 내부에 따라서 정의되는데, float, double 그리고 long double은 각각 한 개, 두 개 그리고 세 개의 분명한 크기를 나타낸다. 표준 라이브러리 헤터 파일인 <limits.h>와 <float.h>에 테이터 타입이 정의되어 있다.

상수

상수는 정해져서 변하지 않는 값을 나타내며 숫자 1234는 정수형 상수이다. long형 상수는 아래와 같이 상수 끝에 접미사로 소문자 l(엘)이나 대문자 L을 붙인다.

123456789l;
123456789L;

unsigned형 상수는 아래와 같이 상수 끝에 접미사로 소문자 u나 대문자 U을 붙인다.

1234u;
1234U;

unsigned long형 상수는 아래와 같이 표현한다.

123456789ul;
123456789UL;

실 수형 상수는 (123.4)처럼 소숫점으로 표현하거나 지수형인 (1e-2)으로 표현한다. 실수형 상수의 크기는 접미사가 없으면 double형이다. 접미사 f 혹은 F는 실수형 상수를 나타내고, 접미사 l 혹은 L은 long double형을 나타낸다.

정 수 값은 10진수 대신에 8진수나 16진수로 표현할 수 있다. 정수 앞에 영(0)을 붙이면 8진수를 의미하고, 0x 혹은 0X를 붙이면 16진수를 의미한다. 예를 들면, 10진수 31은 8진수 037로 16진수 0x1f 혹은 0X1F로 표현할 수 있다. 또한, 8진수와 16진수 상수에도 접미사 L를 붙여서 long형의 상수를 표현하고 접미사 U를 붙여서 unsigned형의 상수를 표현할 수 있다.

0XFUL;

위의 상수는 unsigned long형으로 10진수 15와 같다. 문자 상수는 정수이며 작은 따옴표를 붙여서 ‘a’와 같은 방법으로 나타낸다. 문자 상수의 값은 머신 내부의 문자 집합 안에 있는 문자의 숫자 값이다. 예를 들면, ASCII 문자 집합에서 문자 상수 ‘0’는 48값이다(숫자 0과는 상관없다) 문자 상수는 숫자형으로 동작할 수 있다.

문자 상수는 정수처럼 수치적 연산에 참여할 수 있으며, 다른 문자들과 비교 될 때도 수치 연산 방식으로 동작한다. 특별히 백슬래시(\)로 시작하는 문자상수들이 있다. 이것은 두 개의 문자들로 보이지만 실제로는 하나의 문자 값이다. 이 문자상수는 실행될 때(run-time)가 아닌 컴파일 되는 동안에 값이 정해진다. 이러한 문자상수를 정리하면 아래와 같다.

상수는 보통 매크로 전처리기인 #define으로 정의하여 많이 사용한다. 예를 들면,

문자열 상수는 아래와 같이 큰따옴표를 사용하여 표현한다.

“I am a string”

“hello,“ “world” 는 “hello, world” 와 동일하다. 이것은 문자열이 너무 길어서 여러행의 소스라인에 걸쳐 있을 때, 보기 좋게 분리할 때 유용하다. 예를 들어 아래와 같이 긴 문자열을 사용해야 한다면,

“I think C-programming language is very good. I want to use it for a computer programming. I am studying it for a long time.”

다음과 같이 행 단위로 보기 좋게 분리하여 표현할 수 있다.

“I think C-programming language is very good. “ \
“I want to use it for a computer programming. “ \
“I am studying it for a long time.”

기 술적으로, 문자열 상수는 문자들의 배열이다. 문자열 상수의 끝에는 널문자(‘\0’)가 삽입된다. 따라서 물리적인 기억장소는 실제 문자열의 길이보다 하나 더 많은 공간이 필요하다.  널문자(‘\0’)는 내부적으로 문자열의 끝을 판단하는 용도로 사용된다. 문자열을 다룰 때 주의할 점이 있는데, ‘a’와 “a”를 동일한 것으로 혼동하지 말고 서로 다르게 보아야 한다. ‘a’는 문자상수로 머신의 내부에 정의된 문자집합(ASCII 코드값)에 있는 숫자 값으로 표현될 수 있다. 반면에, “a”는 문자열 상수로서 끝에 널문자가 추가된 문자열이다.

상수를 표현하는 또 다른 방법 중에 하나로 열거형(enumeration)이 있다. 열거형은 정수 상수 값들의 리스트이다. 열거형에서 상수 값을 특별히 정하지 않으면, 첫 번째 이름은 0의 값이고, 두 번째는 1, 그 다음은 2... 이렇게 순서대로 정수 값이 열거된다.

enum escapes { BELL = ‘a’, BACKSPACE = ‘b’, TAB = ‘t’,
    NEWLINE = ‘n’, VTAB = ‘v’, RETURN = ‘r’ };

enum months { JAN = 1, FEB, MAR, APR, MAY, JUN,
    JUL, AUG, SEP, OCT, NOV, DEC };

위와 같이 열거형 상수들을 정의하는 것은 #define을 사용하는 것보다 편리하다.

선언

모든 변수들은 사용하기 전에 선언 되어야 한다. 선언은 아래와 같이 데이터 타입의 종류를 지정하고 여러 가지 변수명들을 나열한다.

   int  lower, upper, step;
   char c, line[1000];

위의 변수명들은 아래와 같이 한 줄에 하나씩 지정할 수도 있다. 이렇게 하면 각각에 주석문(설명)을 추가하기 좋다.

   int  lower;  //시작값
   int  upper;  //종료값
   int  step;   //증가값
   char c;    //문자값
   char line[1000];  //배열

변수는 아래와 같이 선언하면서 초기화할 수도 있다. 등호 부호의 오른쪽에 있는 값이 변수 값으로 초기화 된다.

   char  esc = ‘\’;
   int   i = 0;
   int   limit = MAXLINE+1;
   float eps = 1.0e-5;

만 일 변수가 자동(automatic)이 아니라면, 초기화는 프로그램의 실행이 시작되기 전에 한번만 발생하며 이때 초기화 값은 상수로 표현되어야 한다. 자동 변수의 명시적 초기화는 함수 혹은 블록의 시작 부분에서 발생한다. 초기화 되는 값은 어떤 방식으로든지 가능하다. 외부(external)와 정적(static) 변수는 기본적으로 0으로 초기화 된다. 자동 변수는 명시적으로 초기화 되는 값이 결정되어 있지 않아서 임의(garbage)의 값이 들어간다.

const 식별자는 선언되는 변수들의 종류에 상관없이 지정할 수 있다. const는 변수를 상수화 시켜서 변경되지 않도록 한다. 배열에 대해서도 const가 지정되면, 각각의 배열 요소 값들을 변경할 수 없게 된다.

   const double e = 2.71828182845905;
   const char msg[] = “warning: “;

const는 다음과 같이 함수의 매개변수에도 적용할 수 있다. const가 적용된 배열 매개변수는 함수 내부에서 값이 변경되지 않는다.

   int strlen(const char[]);

산술 연산자들

2항 산술 연산자들은 +, -, *, / 이고 나머지 연산자는 %이다. 정수형 나눗셈은 나머지 부분을 잘라낸다. 아래의 연산식은 x을 y로 나눈 후 나머지를 산출한다. 따라서 y가 x을 정확히 나눈다면 결과값은 0이 된다.

   x % y

아래는 윤년(2월29일)을 판단하는 코드이다. Year 값이 4로 나누어지고 100으로 나누어 지지 않거나 400으로 나누어 진다면 윤년이다.

   if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
    printf(“%d 는 윤년입니다.n”, year);
   else
    printf(“%d 는 윤년이 아닙니다.n”, year);

% 연산자는 float나 double형에는 적용할 수 없다. % 연산자의 나눗셈 방향과 부호는 머신에 의존하여 overflow나 underflow가 발생한다.
연산 우선순위는 부호를 나타내는 단항 연산자인 +와 -가 높고, 다음으로 *, /, % 연산자, 그리고 2항 연산자인 +와 -순이다.  +와 -는 연산순위가 같다.

관계와 논리 연산자들

다음은 관계형 연산자들이다.

   >   >=   <   <=

순서대로 이들의 의미를 나열하면: 크다(>), 크거나 같다(>=), 작다(<), 작거나 같다(<=)이다. 이들은 모두 연산순위가 동일하다.  아래는 등호 연산자들이며 같다(==), 같지않다(!=)를 나타낸다.

   ==   !=

관 계형 연산자들은 산술 연산자들보다 연산순위가 낮다. 따라서 연산식 i < lim -1은 산술 연산인 lim -1이 먼저 계산되고 관계형 연산인 <가 연산되므로 i < (lim -1)과 동일한 연산식이 된다. 좀더 흥미로운 것은 논리 연산자들인 && 와 ||이다. 이들은 연산식들의 왼쪽에서 오른쪽으로 논리를 판단하며 논리값(참과 거짓)이 판단되자마자 논리 평가가 종료된다. 예를 들면,

if (i < lim-1 && c != ‘n’ && c != EOF)

위의 연산식에서

A: i < lim-1
B: c != ‘n’
C: c != EOF

로 하여 if 논리식을 간단히 나타내면 아래와 같은 논리식이 된다.

if (A && B && C)  //A and B and C

위 의 논리가 참이 되려면 A, B, C모두가 참이어야 한다. A, B, C중에서 하나라도 거짓이면 전체 논리는 거짓이 되기 때문에, 왼쪽에서 오른쪽(A → B → C)으로 논리를 판단하다가 거짓이 나오는 즉시 논리판단을 중지하게 된다. 또한, if 논리식이 아래와 같다면, 왼족에서 오른쪽으로 논리를 판단하다가 참이 나오는 즉시 논리판단을 중지하고, 전체 논리식의 결과는 참이 된다.

if (A || B || C)  //A or B or C

논리연산자 &&의 연산순위는 ||보다 높지만, 이들은 관계연산자보다 연산순위가 낮다.

논 리관계가 참인 것은 수치적으로 1, 거짓은 0으로 정의된다. 단항 연산자인 !는 논리가 거짓인 것은 1로 논리가 참인것은 0으로 부정하는 연산자이다. 예를 들면, valid 값이 0이라면, 아래의 if 조건식 2개는 동일한 것이다.

if (!valid)
if (valid == 0)

형변환

연 산 대상자가 서로 다른 데이터 타입이라면 형변환이 일어난다. 예를 들면, 실수형 변수 f와 정수형 변수 i에 대해서 덧셈연산(f + i)을 한다면, 데이터 타입의 크기가 작은 것이 큰 것에 맞추어져 형변환 된다. 즉, 정수형인 i변수가 실수형 변수로 형변환 된다. 이렇게 되면 정수형인 i변수에서 데이터 손실이 발생하지 않는다.

작은 크기의 데이터 타입을 큰 크기의 데이터 타입으로 강제적 형변환 할 수는 있지만, 정수형을 short형으로, 실수형을 정수형으로 형변환하면 데이터가 손실될 수 있기 때문에 경고 메세지가 출력된다. 문자형 데이터 타입은 정수로 형변환 될 수 있기 때문에 다음 연산식의 결과는 정수가 된다.

int n;
n = ‘0’ - ‘0’; //48 - 48 = 0
n = ‘1’ - ‘0’; //49 - 48 = 1
n = ‘2’ - ‘0’; //50 - 48 = 2
n = ‘3’ - ‘0’; //51 - 48 = 3

이러한 특성을 활용하면 문자열을 숫자로 바꿀 수 있다. 아래 함수는 흔히 사용하고 있는 문자열을 숫자로 바꾸는 함수 atoi( )이다.

   int atoi(char s[])
   {
    int i, n;

    n = 0;
    for (i = 0; s[i] >= ‘0’ && s[i] <= ‘9’; ++i)
    n = 10 * n + (s[i] - ‘0’);
    return n;
   }

또 다른 형변환의 예제로 대문자를 소문자로 변환하는 것이 있다. 이것은 문자가 ASCII 상수 값으로 형변환되어 연산됨을 이해할 수 있다.

   int lower(int c)
   {
    if (c >= ‘A’ && c <= ‘Z’)  //ASCII 문자값(정수)로 형변환되어 비교(c >= 65 && c <= 90)
    return c + ‘a’ - ‘A’;  //c + 97 - 65
    else
    return c;
   }

위 의 코드는 ASCII 문자 상수 값이 순서대로 증감되는 순으로 배열되어 있는 특징을 활용한 것이다. 즉, 대문자 ‘A’는 65부터 시작하여 대문자 ‘Z’까지 90에서 종료되고, 소문자 ‘a’는 97에서 시작하여 소문자 ‘z’까지 122에서 종료된다. 대문자와 소문자 차이 값은 ‘a’ - ‘A’로 97 - 65 = 32가 되므로 대문자 값에 32를 더하면 소문자 값이 된다.

표 준 라이브러리 헤더 파일인 <ctype.h>를 참조하면 위와 같은 문자에 관련된 형변한 함수들의 선언을 확인할 수 있다. <ctype.h>에 선언되어 있는 함수 중에서 흔하게 사용되는 isdigit() 함수는 아래와 같이 구현된다.

   int isdigit(int c)
   {
    if (c >= ‘0’ && c <= ‘9’ )
    return 1;
    else
    return 0;
   }

앞으로의 실습예제에서 <ctype.h>에 정의되어 있는 함수들을 사용할 것이다.

문 자가 정수로 형변환 될 때 미묘한 차이점이 있을 수 있다. 문자 변수를 내부적으로 표현할 때 부호가 있는 것(signed)인지 없는것(unsigned)인지 명확하지 않다면 이것을 어떻게 정수로 변환할 것인가? 아키텍쳐(머신,하드웨어)마다 데이터 표현 방식이 다르기 때문에 이것의 정답은 여러가지가 있을 수 있다. 하지만, 대부분의 머신에서 데이터 타입의 가장 왼쪽에 있는 비트(leftmost bit)가 1이면 음수로 인식한다. 문자를 정수로 변환할 때 가장 왼쪽 비트를 0으로 하면 항상 양수가 된다.

C언어에서는 인쇄 가능한 문자로 표준화된 것은 모두 양수로 정의하고 있다. 그러나 특정 머신의 문자 변수에 저장되어 있는 임의의 비트 패턴은 양수가 아니라 음수가 될 수 있기 때문에, 호환성을 고려하여 문자 데이터 변수들을 선언할때는 부호가 있는 것(signed)인지 없는 것(unsigned)인지 명시하는 것이 좋다.

관계형 연산(>, >=, <, <=, ==, !=) 결과와 논리형 연산(&&, ||) 결과가 참이면 1, 거짓이면 0으로 정의된다.  따라서, 다음의 연산식에서 c가 숫자이면 d는 1, c가 숫자가 아니면 0값을 가진다.

   d = c >= ‘0’ && c <= ‘9’

또한, 아래와 같이 if 안의 조건식 논리가 참이라는 것은 결과가 0이 아니라는 의미이다. 즉, 결과가 음수이거나 양수에 상관없이 0이 아니면 참이 된다.

   if (c >= ‘0’ && c <= ‘9’)

산 술연산이 수행될 때 산술대상(operand)의 데이터 타입이 다르다면 묵시적으로 형변환이 발생하는데, 이때, 상대적으로 작은 데이터 타입이 큰 데이터 타입쪽으로 변환된 후 산술연산이 진행되며 일반적으로 다음과 같은 형변환 규칙이 적용된다.(unsigned가 없는 경우)

 • 만약 연산대상(operand) 중에서 하나라도 long double형이 있다면, 다른 것들은 long double형으로 변환된다.
 • 그렇지 않다면, 만약 연산대상 중에서 하나라도 double형이 있다면, 다른 것들은 double형으로 변환된다.
 • 그렇지 않다면, 만약 연산대상 중에서 하나라도 float형이 있다면, 다른 것들은 float형으로 변환된다.
 • 그렇지 않다면, char와 short는 int형으로 변환된다.
 • 그런다음, 연산대상 중에서 하나라도 long형이 있다면, 다른 것들은 long형으로 변환된다.

한 가지 유의할 점은 float형은 자동적으로 double형으로 변환되지 않는다는 것이다. 이것은 원래의 정의에서 조금 어긋나지만, float를 사용하는 이유는 double형에 비해서 기억장소를 절약하고 연산속도를 빠르게 하기 위함이다. double형이 연산 비용이 높지만, <math.h>에 정의 되어 있는 수학적인 라이브러리 함수들은 double형을 사용한다.

연 산 대상에 unsigned가 포함되어 있는 경우에는 형변환 규칙이 좀더 복잡하다. 왜냐하면, signed와 unsigned간의 연산은 머신에 의존하여 그 크기가 달라지기 때문이다. 예를 들면, int형의 크기가 16비트이고 long형의 크기가 32비트라고 가정하자. 이때, -1L은 1U보다 작다(-1L < 1U). -1L은 signed long형이고 1U는 unsigned int형이기 때문에 1U가 signed long형으로 변환된다. 그러나, -1L은 1UL보다 크다(-1L > 1UL).

왜 냐하면 -1L이 unsigned long형으로 변환되어 좀더 큰 양수로 되기 때문이다. 이것은 아주 예외적인 결과이므로 각자의 머신에서 확인해 보는 것이 필요하다. 형변환은 연산 결과값을 할당할 때도 발생한다. 연산식의 우변에서 계산된 결과와 좌변의 데이터 타입이 다를 때, 좌변의 데이터 타입으로 형변환 된다. 예를 들면,

   int  i;
   char c;

   i = c;
   c = i;

위에서 문자 c가 부호가 있는지 여부에 상관없이 c의 값에는 변화가 없다.  그러나 아래의 예제에서는,

float x;
int i;

x = i;
i = x;

실 수형이 정수로 변환될때 단편적인 잘림 현상이 발생할 수 있기 때문에 i 값은 달라질 수 있다. 또한 double형과 float형간의 변환에도 반올림이나 잘림 현상이 발생할 수 있다. 함수 호출 시 매개변수에 값을 전달하는 것도 할당의 표현이기 때문에 형변환이 발생할 수 있다. 함수를 정의할 때 데이터 타입을 명시하지 않으면, char와 short는 int형으로 float는 double형으로 되기 때문에 함수의 매개변수는 int나 double형으로 선언하는 것이 좋다.

마지막으로, 아래와 같이 단항 연산자를 사용하여 형변환을 명시적(강제적)으로 할 수 있다.  이것을 “cast 한다”라고도 하며, 어떤 데이터 타입에도 표현할 수 있다.

  (type name) expression

예를 들면,

int n;
double dn;

dn = (double) n;

위 에서 정수형 변수 n은 명시적으로 double형으로 변환(cast)되어 dn에 할당된다. <math.h> 헤더 파일에 정의 되어 있는 sqrt함수는 매개변수가 double형이기 때문에, 이것을 호출할 때 sqrt((double) n)와 같이 형변환 연산자를 명시적으로 넣어 주도록 한다. 형변환 연산자는 n의 값은 변환하지만 n 자신은 변환하지 않는다는 것을 알아두자. 이것의 연산순위는 단항 연산자들처럼 높다.

아래는 0에서 32767 사이의 난수(random)값이 산출되는 코드이다.

   unsigned long int next = 1;

   int rand (void)
   {
    next = next * 1103515245 + 12345;
    return (unsigned int) (next/65536) % 32768;
   }
    void srand (unsigned int seed)
   {
    next = seed;
   }

증감 연산자

C언어는 2개의 유용한 증감 연산자를 제공한다. 증가 연산자인 ++는 연산대상에 1을 더하고, 반면에 감소 연산자인 는 연산대상에서 1을 뺀다.

n++;  //n에 1을 더한다
n;  //n에서 1을 뺀다

이 러한 증감 연산자는 변수 앞(++n)이나 변수 뒤(n++)에 사용할 수 있는데 연산 방향에 차이점이 있다. ++n는 n을 1증가 시킨 후에 n을 사용하지만, n++는 n을 사용한 후에 1을 증가시킨다. 예를 들면, 아래코드에서 n의 값에 5가 저장되어 있다면,

   n = 5;
   x = n++;

n의 값이 먼저 x에 할당된 후에 n이 1증가 되므로 x = 5, n = 6이 된다.

   n = 5;
   x = ++n;

n의 값이 먼저 1증가된 후에 n의 값이 x에 할당되므로 x = 6, n = 6이 된다.

증감연산자의 대상은 변수명이다. (i+j)++와 같이 연산 수식에는 사용할 수 없다. 증감연산자는 다음과 같이 배열의 인덱스 변수나 반복문(loop)의 제어변수에 많이 사용된다.
(배열과 반복 제어문은 다음 장에서 자세히 설명하므로 아래 코드는 참고적으로 알아두자.)

   if (c == ‘n’) {
    s[i] = c;
    ++i;
   }

위의 코드는 아래와 동일하다.

   if (c == ‘n’)
    s[i++] = c;

또한,

   while (s[i] != ‘
공개SW 기술팁 - 번호, 제목, 조회수, 작성
번호 제목 작성 조회수
384 [C언어와 알고리즘] 포인터와 배열 (5) 2012-08-17 2882
383 [C언어와 알고리즘] 함수와 프로그램 구조 (4) 2012-08-17 2750
382 [C언어와 알고리즘] 제어 흐름 (3) 2012-08-17 2134
381 [C언어와 알고리즘] C언어 형태, 연산자, 표현 (2) 2012-08-17 4594
380 [C언어와 알고리즘] C언어 소개 (1) 2012-08-17 2264
379 [정보통신단체표준] 공개소프트웨어 분류체계 및 프로파일 file 2012-01-03 1484
378 솔루션발굴(Pengrix-Standard-Edition) file 2011-06-24 1300
377 KWordQuiz 메뉴얼 file 2011-06-20 993
376 Khangman 메뉴얼 file 2011-06-20 871
375 Kgeography 메뉴얼 file 2011-06-20 1028
맨 위로
맨 위로