C 언어 프로그램은 같은 이름을 갖는 함수를 정의할 수 없으나 C++에서는 가능하다. 이렇게 같은 이름을 갖는 함수들을 작성하는 것을 함수 중복(overloading)이라고 하며 전역 함수와 클래스의  멤버 함수 모두에 가능하다.


 예를 들면 다음과 같다.

void print();
void print(int ia);
void print(char *str);
void print(int ia, bool bNewLine);

이 예제들의 세 개의 print()함수는 모두 같은 이름을 갖지만 입력 인자가 서로 다르므로 모두 다른 함수들이다. 이와 같이 함수의 중복이 가능하려면 각각을 구별해야 하므로 다음의 조건들을 만족해야 한다.

       ❶ 중복되는 함수들의 입력 인자의 개수가 다르거나 타입이 달라야 한다.

       ❷ 반환형만 다르고 입력 인자가 같은 중복은 허용되지 않는다.

따라서 다음의 두 함수는 함수 중복의 요건이 안 되기 때문에 오류를 발생한다.

void print(string stra);
int print(string stra);

 함수 중복을 이용하면 같은 종류의 일을 하는 서로 다른 입력 인자를 갖는 함수들을 같은 이름으로 일관성 있게 관리할 수 있으므로 무척 효율적이다. 또한 컴파일러는 함수가 호출될 때 대응되는 함수를 프로그램이 실행될 때가 아니라 컴파일할 때 결정하므로 함수 중복으로 인해서 실행 시간이 지연되는 않는다.


 다음 예를 실행해 보자.


#include "stdio.h"

void print();
void print(char *);

int main(void)
{
print(); //❶을 호출
print("Jang-Hyun Park");//❷를 호출
}

void print() //
{
printf("Hello.\n");
}

void print(char *name) //
{
print(); //❶ 을 호출
printf("My name is %s.\n", name);
}


Hello.
Hello.
My name is Jang-Hyun Park.


함수 ❷ 내부에서도 함수 ❶을 호출할 수 있음을 유의해서 보자. 사실 두 함수는 이름만 같을 뿐 내부적으로는 완전히 다른 함수로 취급되므로 이러한 상호 호출이 가능하다.



Posted by 살레시오
,

3.12 연산자 우선 순위와 결합 방향    [doc]    [smts]

3.12.1 연산자 우선 순위

한 수식에 여러 개의 연산자를 사용하는 경우에 연산자들의 우선순위를 고려하지 않을 수 없다. 연산자 우선순위를 정리하면 다음과 같다.


  1. 괄호, 배열, 구조체, 공용체멤버를 나타내는 지시자 (), [], ->, . 은 우선순위가 가장 높다.

  2. 한 개의 피연산자를 갖는 단항연산자(!, ++, -- 등)이 그 다음으로 우선순위가 높다.

  3. 그 다음은 산술 연산자 (+, - *, /, %)이다.

  4. 쉬프트연산자와 비교연산자는 비트연산자보다 연산순위가 높다.

  5. 맨 하위에 대입연산자와 콤마(,)연산자가 있다.


[표 3.12.1] 연산자 우선 순위와 결합 방향

순위

연산자

결합 방향

1

( ) [ ] -> .

2

! ~ ++ -- - + (cast) *(pointer) &(addr) sizeof

3

* / %

4

+ -

5

<< >>

6

< <= > >=

7

== !=

8

&

9

^

10

|

11

&&

12

||

13

?:

14

= += -= *= /= %= ^= |= <<= >>=

15

,


연산자 우선 순위와 결합 방향을 고려하여 프로그래밍하는 것은 프로그래머의 몫이며 프로그래밍은 가독성(간결성)과 효율(길이) 측면에서 고민하게 되는 경우가 자주 발생한다. 한 수식에 부득이하게 연산자를 여러 개를 써야 한다면 괄호 등을 적극 활용하여 우선 순위를 명확히 하는 것이 좋다.


3.12.2 연산자 결합 방향

한 수식에서 동일한 우선순위를 가진 연산자들이 연속적으로 나타나 있으면 연산자의 결합 방향을 고려하여야 한다. 대부분의 연산자들은 왼쪽에서 오른쪽으로 결합을 한다. 하지만 반대로 오른쪽에서 왼쪽으로 결합하는 연산자가 있다.


  1. 단항연산자, 형변환연산자, sizeof등은 오른쪽에서 왼쪽으로 결합한다.

  2. 조건 연산자 (?) 는 오른쪽에서 왼쪽으로 결합한다.

  3. 대입 연산자는 오른쪽에서 왼쪽으로 결합한다.


[표 3.11.1] 연산자 결합 방향 예시

수식

결합 결과

a = x +y - z

a = (x + y) - z

a = x * y / z

a = (x * y) / z

a = x && y || z

a = (x && y) || z

a = y+= z

a = (y+= z)

a = *x++

a = *(x++)


예를 들어서 sA=sY+=sZ 와 같은 표현식은 내부적으로 정해진 결합 순서에 의해서 오른쪽에서 왼쪽으로 결합하겠지만 프로그래머가 아예


sA = (sY += sZ);

와 같이 괄호를 명시하든가 더 가독성을 높이려면


sY += sZ;
sA = sY;

와 같이 두 줄로 나누어 쓰는 것이 더 나아보일 수도 있다. 이는 전적으로 작성자의 성향에 달려있다고 할 수 있다.



Posted by 살레시오
,

 이전 포스트에서처럼 배열은 선언을 먼저 하고 나중에 초기화할 수도 있지만 선언과 동시에 초기화할 수도 있다. 배열을 선언하면서 초기화하는 문법은 다음과 같다.


자료형 배열명[크기] = {값0, 값1, 값2, ... };


배열을 선언하면서 동시에 초기화를 하면 배열 크기는 생략할 수 있다. 이 경우 배열의 크기는 초기값의 개수에 따라 결정된다.


 앞서 들었던 예를 이 방법으로 초기화시키면 다음과 같다.


int iaLength[] = {170, 169, 178, 159, 164};


이렇게 하면 초기값의 개수에 의해서 배열의 크기는 5로 자동으로 결정되게 된다. 만약 배열에 저장할 값들이 미리 정해져 있다면 이 방법이 훨씬 더 간단함을 알 수 있다.


 선언할 때 배열의 크기를 지정했는데 주어진 초기값들이 그 크기보다 작다면 나머지 배열의 요소는 0으로 채워진다. 예를 들어


short saA[100]={1};


의 경우 변수 saA의 첫 번째 요소 saA[0]는 1로, 나머지 saA[1]부터 saA[99]까지는 0으로 초기화 된다.


 하지만 아예 초기값을 주지 않은 경우라면, 예를 들어


char caA[20];


와 같은 경우라면 다음 절에 설명하듯이 이 배열이 전역/정적 배열인지 지역배열인지에 따라서 동작이 달라진다.


이제 배열을 이용하며 다섯 명의 평균키를 구하는 예제를 작성하면 다음과 같다.


#include <stdio.h>
int main()
{
   int iaHeights[] = {170, 169, 178, 159, 164};
   float fAverage = 0.f;
   for (int k=0; k<5; k++) {
       fAverage += iaHeights[k];
   }
   fAverage /= 5;
   printf("average : %f\n", fAverage);
}


여기에서는 산술 평균 (다 더한 후 개수로 나눈 값)을 구해서 화면에 표시해 준다.




Posted by 살레시오
,

5.1 배열의 선언과 초기화     [doc]     [smts]

배열(array)을 설명하기 위해서 다음 표에 기록되어 있는 5명 학생의 몸무게를 데이터로 저장하는 문제로 설명을 시작하도록 하겠다.


[표 5.1.1] 다섯 명의 키 데이터

번호

1

2

3

4

5

키(cm)

170

169

178

169

164


이 5명의 키 자료들을 입력하기 위해서 다음과 같이 int형 변수 5개를 각각 사용할 수 있을 것이다.


int iHeight1 = 170;
int iHeight2 = 169;
int iHeight3 = 178;
int iHeight4 = 159;
int iHeight5 = 164;

이렇게 데이터를 저장하여 관리하여도 문제가 없지만 여러 가지 이유로 비효율적이다.


이와 같이 동일한 성질의 데이터들을 하나의 이름으로 다루기 위해서 배열이라는 자료형이 있다. 배열은 같은 자료형의 데이터들을 연속적인 메모리 공간에 차례대로 저장해서 같은 변수명으로 관리할 수 있다.


 C 언어에서 배열을 선언하는 문법은 다음과 같다.


자료형 배열명[배열크기];

앞에서 예를 든 다섯 명의 키를 저장하는 배열을 선언하기 위해서 다음과 같이 하면 된다.


int iaHeights[5];

여기에서 iaHeights 는 배열의 이름(배열명)이며 배열의 요소(element)의 자료형은 int형이고 배열의 크기는 5이므로 이 배열에는 최대 다섯 개의 int형 값을 저장할 수 있는 것이다.


[표 5.1.2] iaHeights 배열의 메모리 구조

인덱스

0

1

2

3

4

요소

int형

int형

int형

int형

int형


배열 변수를 선언하였다면 이제 다음과 같이 초기화할 수 있다.


iaHeights[0] = 170; //첫 번째 데이터 초기화
iaHeights[1] = 169; //두 번째 데이터 초기화
iaHeights[2] = 178; //세 번째 데이터 초기화
iaHeights[3] = 159; //네 번째 데이터 초기화
iaHeights[4] = 164; //다섯 번째 데이터 초기화

여기서 '배열명[0]' 은 배열의 첫 번째 요소를 지칭한다. 대괄호 [...] 안의 숫자는 배열의 인덱스(index)라고 한다. 인덱스는 1부터가 아니라 0부터 시작하는 것에 유의해야 한다. 배열의 요소는 일반 변수와 동일하게 읽을 수 있으며 갱신할 수 있다.


 다섯 명의 키를 처리하기 위해서 다섯 개의 별개의 변수를 각각 사용하는 것보다 이렇게 배열을 이용하는 것이 훨씬 효율적인데 이는 데이터의 일관성을 유지할 뿐만 아니라 반복문을 사용하기에 용이해서 그렇다.


이제 이 다섯 명의 키를 화면에 출력하는 프로그램을 작성해 보자.


0501-01.c
#include <stdio.h>
int main()
{
  int iaHeights[5]; //배열 선언

  iaHeights[0]=170;
  iaHeights[1]=169;
  iaHeights[2]=178;
  iaHeights[3]=159;
  iaHeights[4]=164;

  for (int k=0; k<5; k++) {
      printf("%d:%d\n",k,iaHeights[k];
  }
}

 위와 같이 배열은 선언을 먼저 하고 나중에 초기화할 수도 있지만 선언과 동시에 초기화할 수도 있다. 배열을 선언하면서 초기화하는 문법은 다음과 같다.


자료형 배열명[크기] = {값0, 값1, 값2, ... };

배열을 선언하면서 동시에 초기화를 하면 배열 크기는 생략할 수 있다. 이 경우 배열의 크기는 초기값의 개수에 따라 결정된다.


앞서 들었던 예를 이 방법으로 초기화시키면 다음과 같다.


int iaLength[] = {170, 169, 178, 159, 164};

이렇게 하면 초기값의 개수에 의해서 배열의 크기는 5로 자동으로 결정되게 된다. 만약 배열에 저장할 값들이 미리 정해져 있다면 이 방법이 훨씬 더 간단함을 알 수 있다.


선언할 때 배열의 크기를 지정했는데 주어진 초기값들이 그 크기보다 작다면 나머지 배열의 요소는 0으로 채워진다. 예를 들어


short saA[100]={1};

의 경우 변수 saA의 첫 번째 요소 saA[0]는 1로, 나머지 saA[1]부터 saA[99]까지는 0으로 초기화 된다.


하지만 아예 초기값을 주지 않은 경우라면, 예를 들어


char caA[20];

와 같은 경우라면 다음 절에 설명하듯이 이 배열이 전역/정적 배열인지 지역배열인지에 따라서 동작이 달라진다.


이제 배열을 이용하며 다섯 명의 평균키를 구하는 예제를 작성하면 다음과 같다.


0501-02.c
#include <stdio.h>
int main()
{
  int iaHeights[] = {170, 169, 178, 159, 164};
  float fAverage = 0.f;
  for (int k=0; k<5; k++) {
      fAverage += iaHeights[k];
  }
  fAverage /= 5;
  printf("average : %f\n", fAverage);
}

여기에서는 산술 평균 (다 더한 후 개수로 나눈 값)을 구해서 화면에 표시해 준다.



Posted by 살레시오
,

 비트 마스킹은 다음과 같이 세 가지로 정리된다.

       ❶ 특정 비트를 0으로 만든다. (reset)

       ❷ 특정 비트를 1로 만든다. (set)

       ❸ 특정 비트을 반전시킨다. (toggle)

특정한 비트를 0으로 만들려면 0과 AND연산을 하면 되고 1로 만들려면 1과 OR연산을 하면 된다. 반전시키려면 1과 XOR연산을 취하면 된다. 다음 표에 이것을 정리하였다.

[표 1] 비트 마스크의 종류


x

x&0

0

0

1

0



x

x|1

0

1

1

1



x

x^1

0

1

1

0


이러한 비트 연산 특성을 이용하면 이진수의 특정위치의 비트들을 강제로 1, 0으로 만들거나 혹은 반전시킬 수 있으며 마이크로콘트롤러의 프로그래밍에서 사용빈도가 매우 높은 기법이다.

 비트 이동연산자 << 를 마스킹기법과 조합하여 사용하여 원하는 하나의 비트를 조작하기도 한다. 예를 들어서 unsigned short형 변수 usA가 0xa00b일 때 다른 비트값들은 그대로 유지한 채 8번 비트(b8)만 강제로 1로 만들고 싶다면 다음과 같이 하면 된다.


unsigned short usA = 0xa00b;
usA |= (1<<8);


여기서 (1<<8)의 결과는 이진수로 표시하면 0b 0000 0001 0000 0000 이며 b8만 1로 세트된 데이터이다. 반대로 n번 비트를 0으로 만들고 싶다면 ~(1<<n)과 AND연산을 하면 되고(1<<n 을 반전시켰음에 유의하라), n번 비트를 반전시키려면 (1<<n)과 XOR연산을 취하면 된다.


unsigned short usA = 0xa00b;
usA &= ~(1<<8); //8번 비트만 0으로 만든다


unsigned short usA = 0xa00b;
usA ^= (1<<8); //8번 비트만 반전한다.


 이러한 방법은 특정한 비트가 0인지 1인지를 조건 검사할 경우에도 사용된다. 만약 unsigned char형 변수 ucVar의 6번 비트(b6)가 0인지를 검사하려면 다음과 같이 조건 검사를 하면 될 것이다.


if (ucVar & (1<<6) == 0 ) {
   ...
   // ucVar 의 6번 비트가 0일 경우 수행할 명령들
   ...
} else {
   ...
   // ucVar 의 6번 비트가 1일 경우 수행할 명령들
   ...

}


일반적으로 n번 비트가 0인지를 조사하려면 (1<<n)과 변수와 and연산을 취하여 그 결과가 0인지 검사하면 된다. 이 조건이 거짓이라면 그 비트는 1이라는 결론을 얻을 수 있다.



Posted by 살레시오
,
  1. 화면의 첫 번째 줄에는 영문 이름을, 두 번쩨 줄에는 학번을 표시하고 세 번제 줄에는 생년월일을 출력하는 프로그램을 작성하라.


  1. 정수형 변수 a, b, c 를 각각 선언하고 a에는 1, b에는 2를 대입한 후 c 에는 a와 b의 곱을 대입하는 프로그램을 작성하라. (두 수의 곱은 ‘*’ 연산자를 사용한다.)


  1. 10진수 32456을 16진수로 표시하고 16진수 A9B7 을 10진수로 표시하는 프로그램을 작성하라. 또한 2진수 110011110010을 10진수로 표시하라.


  1. float형 변수 pi 에 원주율(3.141592)를 저장하고 float형 변수 e 에 자연상수(2.718281)울 저장하라. 그리고 그 수를 float형 변수 sum에 저장하라.


  1. 자연상수(2.718281...)를 E라는 상수로 정의하라. 그리고 원주율(3.141592)를 PI로 정의하라. 이후에 float형 변수 sum을 두 수의 합으로 초기화하라. 문제 4번 과의 차이점이 무엇인가 설명하라.


  1. 숫자값인 164 을 계산해서 화면에 십진수와 16진수로 표시하는 프로그램을 작성하라.


  1. sizeof 연산자는 주어진 데이터형의 바이트수를 반환해주는 매크로이다. 예를 들어서 sizeof(short)는 short형이 2바이트를 차지하기 때문에 2를 반환한다. 이것을 이용하여 char, short, int, long, long long, float, double, long double 형의 바이트 수를 화면에 모두 표시하는 프로그램을 작성하라.



Posted by 살레시오
,

 C/C++ 에서 typedef명령은 데이터형을 식별자로 대체하여 사용하게 해주는 명령이다. (type definition 두 단어를 조합해서 만든 듯 하다.)  다른 포스트에서 설명한 #include, #define 과 같은 전처리 명령어와 달리 #이 붙지 않고 끝에 세미콜론 ; 이 붙는다는 점에 유의하자.


 예를 들면 다음과 같다.


typedef unsigned char uchar;
typedef int INCHES, FEET;
typedef unsigned long size_t;


첫 번째 줄의 예를 보면 unsigned char 형을 uchar라는 새로운 이름(식별자)으로 정의하였고 두 번째 줄은 int 형을 INCEHES와 FEET라는 새로운 이름으로 정의하였다. 이후로는 다음과 같이 변수를 정의할 수 있다.


uchar ucA, ucB = 10; // unsigned char 형
INCHES length, width; // int 형


여기에서 ucA와 ucB는 unsinged char형이고 length와 width는 int형 변수이다.


  이렇게 이름을 새로 정의함로써 얻어지는 장점들은 다음과 같다.


❶ 긴 이름의 데이터형을 짧은 이름으로 대체할 수 있다.

❷ 자료형에 추가적인 의미를 부여할 수 있다.

또한 이 typedef명령어는 나중에 소개할 열거형(enum)과 구조제(struct)와 조합해서 자주 쓰이기도 한다.



Posted by 살레시오
,

 printf()함수는 기본적으로 첫 번째 인자인 문자열을 화면에 표시해주는 역할을 하는 함수로서 stdio.h 헤더화일에 정의되어 있다. 함수와 헤더화일에 대한 개념은 차후에 설명하도록 하고 여기에서는 기본적인 사용법만 익히고 넘어가도록 하겠다. 이 함수를 사용하기 위해서는 반드시 프로그램 시작 부분에 stdio.h를 인클루드시켜야 한다.

#include <stdio.h>


printf()함수 안에서 변수의 값을 표시하는데 쓰이는 문자를 서식 문자’라고 한다. 변수의 출력에 많이 쓰이는 서식문자를 다음 표에 정리하였다.


[표 1] printf()함수의 서식 문자

구분

서식 문자

출력 형태

정수형

%d

10진수 정수

%x

16진수 정수

%c

문자

실수형

%f

10진수 실수 (float형)

%e

10진수 실수 (지수형 표기)

%lf

10진수 실수 (double형)

문자열

%s

문자열 출력

그리고 앞의 예제에서도 자주 사용되었듯이 ‘\n' 문자는 다음 줄 맨 첫 칸으로 돌아가라는 동작을 수행하게 하는 특수 문자이다. 이와같이 printf()함수 내에서 사용되는 문자 ’\’를 이스케이프(escape)문자라고 한다. 이것을 이용한 몇 가지 자주 사용되는 문자는 다음과 같다.

[표 2] printf()함수의 특수 제어 문자

문자

기능

\n

줄바꿈

\t

수평 탭(tab)

\a

‘삑’하는 beep음을 발생한다.

\\

역슬래시 문자(\) 자체를 표시

\“

따옴표 문자를 표시


한글자판에서는 역슬래시(backward slash)가 원화 기호 ₩로 표시되므로 유의하자.

#include <stdio.h>
int main() {
   char cA = 'A';
   unsigned short usA = 100;
   float fA = 1.5;
   printf("The cA is %c and %d in decimal.\n", cA, cA);
   printf("The usA is \n");
   printf("%d and 0x%x in hexadecimal.\n", usA, usA);
   printf("The fA is %f \n", fA);
   printf("Hello %s.\n", "world!");
}


The cA is A and 65 in decimal.
The usA is 100 and 0x64 in hexadecimal.
The fA is 1.500000
Hello world!.


위의 프로그램에서 usA값의 두 가지 출력 출력값과 문자열을 출력하는 세 번째 printf()함수의 사용법을 눈여겨 보도록 하자.




'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

C/C++ 자료형 연습문제  (3) 2015.05.24
C/C++ 의 typedef 명령어  (1) 2015.05.24
C/C++ #define 문으로 상수 기호 정의하기  (0) 2015.05.24
C/C++의 구분 기호와 주석  (0) 2015.05.24
1.9 식별자와 예약어  (0) 2015.05.24
Posted by 살레시오
,

 #define은 상수를 이름으로 정의하거나 매크로 함수를 정의할 때 사용하는 전처리문이다. (전처리문이란 컴파일을 수행 하기 전 소스 코드를 변환시켜주는 명령어들을 말한다.)  #define을 잘 활용하면 가독성이 향상된 프로그램을 만들 수 있고 프로그램을 수정하기에 효율적으로 작성할 수 있다. 기본 형식은 다음과 같다.


#define NAME VALUE


NAME은 그 뒤에 있는 숫자를 대신해서 사용할 명칭이다. 맨 끝에 세미콜론(;)이 붙지 않음에 유의하자.

다음 예를 보자.


#include <stdio.h>
#define PI 3.14  // PI를 3.14로 정의
int main() {
   float fR = 3.0;
   printf("radius : %f\n", fR);
   printf("circumference : %f \n", 2*PI*fR);
   printf("area : %f \n", PI*fR*fR);
   printf("volume : %f \n", 4*PI*fR*fR*fR/3);
}


radius : 3.000000
circumference : 18.840000
area : 28.260000
volume : 113.040000


두 번째 줄을 보면 다음과 같이 작성되어 있는데

#define PI 3.14


이것은 3.14라는 실수값을 PI라는 이름으로 사용하겠다는 정의이다. 실제로 프로그램상에서 printf()함수 안에서 사용되었다. 이 코드는 전처리기에 의해서 컴파일 전에 다음과 같이 내부적으로 수정된다.


printf("원의 둘레: %f \n", 2*3.14*fR);
printf("원의 면적: %f \n", 3.14*fR*fR);
printf("구의 체적: %f \n", 4*3.14*fR*fR*fR/3);


따라서 처음부터 직접 위와 같이 작성하나 #define 문을 사용해서 PI라는 기호로 작성하나 내부적으로는 아무런 차이가 없다. 하지만 다른 사람이 볼 때 PI라는 ‘의미를 유추할 수 있는 기호’를 사용하는 것과 3.14라는 숫자를 직접 사용하는 것과는 차이가 있다.


 더 큰 문제는 3.14라는 상수 값을 예를 들어 3.1415로 변경시켜야 할 경우가 발생했을 때이다. 위와 같이 프로그램했을 경우 세 곳을 모두 고쳐야 하지만 #define문을 사용한 경우에는 정의한 곳 한 곳만 고치고 다시 컴파일 해주면 된다. 이 예에는 세 곳이지만 프로그램이 길어진다면 수십 곳, 수백 곳이 될 수도 있을 것이다.

 전술한 바와 같이 #define문으로 상수에 적절한 이름을 부여하는 것은 프로그램의 가독성 측면이나 수정의 용이함 등을 따질 때 그 활용도가 상당히 높다고 할 수 있다.



Posted by 살레시오
,

1.10  구분 기호와 주석    [DOC]    [SMTS]

1.10.1 구분 기호

 구분 기호(punctuator)는 C언어를 구성하는 요소들을 구분할 때 쓰이는 기호들이다. 다음 표에 기본적인 구분기호를 정리하였다. 현재 단계에서는 모두 알 필요가 없고 앞으로 실습을 진행하면서 하나하나 익히게 될 것이다.


표 1.10.1 구분 기호

기호

설명

사용 예

; (세미콜론)

실행문의 끝에 반드시 써야함.

int iA;
printf(“Hello world”);
return;

{ }

2개 이상의 실행문을 한 단위로 묶을 때 사용함.

{ iA++; iB = iA+iC; }

( )

함수명 뒤, 연산 등에 사용

main(), 2*(1+iA), (int)fA

< >

외부파일을 편입할 때

#include <stdio.h>

C프로그램은 실행문 끝에는 반드시 세미콜론(;)이 붙어야 한다. 초보자들이 흔히 하는 실수가 세미콜론 없이 줄바꿈을 하는 경우이다. 보통은 세미콜론이 붙으면 다음 줄로 넘겨서 프로그램을 작성하게 되지만 한 줄에 여러 실행문을 세미콜론으로 구별하여 나열하여도 된다.

1.10.2 주석

 주석(comment 또는 remark)은 프로그램에 대한 설명을 추가하는데 사용된다. C 프로그램에 주석을 다는 방법은 두 가지가 있는데 먼저 한 줄 주석은 더블슬래시( // ) 뒤에 한 줄 이내로 써주면 되고 두 번째로 주석문이 여러 줄일 경우는 시작기호 /* 와 종료기호 */ 사이에 넣어주면 된다.(C 언어의 경우 한 줄 주석은 C99 이후부터 지원한다.) 컴파일러는 주석 기호를 만나면 프로그램으로 취급하지 않고 무시한다.


 주석문은 컴파일러의 입장에서는 없어도 아무 상관없지만 프로그래머의 입장에서는 매우 중요하다. 그 이유는 다른 사람이 본인의 프로그램을 분석하거나 혹은 시간이 얼마간 지난 후에 본인이 작성한 프로그램을 다시 분석할 때에도 주석문이 꼼꼼하게 작성되어 있는 경우에는 도움이 되기 때문이다.


 전 장에서 자동으로 생성되었던 프로그램을 다음과 같이 수정해 보자.


ex01-02.c
/* 본 프로그램은
2015년 3월에 작성되었다.*/
#include <stdio.h>
int main() {
  printf("Hello world!\n"); // 문자열 출력
}
실행 결과
Hello world!

프로그램 서두에 /* ~ */ 로 둘러싸인 부분이 주석이다. 그리고 printf()함수가 있는 줄의 끝에 // 로 시작하는 한 줄 주석이 달려있다.(녹색 부분) 이 프로그램에서 주석이 없어도 실행에는 전혀 문제가 없다. 즉, 컴파일러 입장에서는 주석이 있으나 없으나 전혀 상관이 없다. 주석은 사람이 프로그램이 읽을 때 이해에 도움이 되는 설명을 덧붙이는데 사용된다.



Posted by 살레시오
,