대입 연산자(=)와 산술 연산자(+,-,*,/,%)

두 개의 피연산자를 요구하는 연산자를 가리켜 '이항 연산자(binary operator)' 라 한다.

연산자 연산자의 기능 결합방향
= 연산자 오른쪽에 있는 값을 연산자 왼쪽에 있는 변수에 대입한다. 예)num = 20;
+ 두 피연산자의 값을 더한다. 예) num = 4+3;
- 왼쪽의 피연산자 값에서 오른쪽의 피연산자 값을 뺀다.
* 두 피연산자의 값을 곱한다. 예) num = 4*3;
/ 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눈다. 예) num = 7/3;
% 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눴을 때 얻게 되는 나머지를 반환한다. 예) num = 7%3;

다음 예제를 통해서 위의 연산자들의 사용의 예를 보자.

<OperatorOne.c>

#include <stdio.h>

int main(void)
{
    int num1=9, num2=2;
    printf("%d+%d=%d \n", num1, num2, num1+num2);
    printf("%d-%d=%d \n", num1, num2, num1-num2);
    printf("%dx%d=%d \n", num1, num2, num1*num2);
    printf("%d÷%d의 몫=%d \n", num1, num2, num1/num2);
    printf("%d÷%d의 나머지 =%d \n", num1, num2, num1%num2);
    return 0;
}

실행 결과

 

부호연산의 의미를 갖는 +연산자와 - 연산자

+ 연산자와 - 연산자는 이항 연산자로서 덧셈과 뺄셈을 의미하지만, 피연산자가 하나인 단항 연산자로서 부호를 뜻하기도 한다. 이는  +3, -7과 같이 숫자 앞에 붙는 부호를 뜻하는 것이므로 생소하지 않을 것이다. 이와 관련한 예제를 보자

<OperatorThree.c>

#include <stdio.h>
int main(void)

     int num1= +2; 
     int num2= -4; 
     num1 = -num1; 
     printf("num1 : %d \n", num1); 
     num2 = -num2;   
     printf("num2 : %d \n", num2); 
     return 0;
}

실행결과

참고

부호 연산자가 삽입된 문장과 복합 대입 연산자가 삽입된 문장을 혼동하는 경우가 있다. 다음과 같이 연산자와 피연산자 사이에 공백을 삽입하지 않는 경우에는 더욱 혼동하기가 쉽다.

num1 =-num2; // 부호 연산자의 사용
num1-=num2; // 복합 대입 연산자의 사용

따라서 모든 경우에 연산자와 피연산자 사이에 공백을 두지는 않더라도, 위의 두 경우에 한해서는 다음과 같이 공백을 두는 것이 혼란을 최소화할 수 있는 방법이 된다.

num1 = -num2; //부호 연산자의 사용
num1 -= num2; //복합 대입 연산자의 사용

 

 

증가, 감소 연산자

연산자 연산자의 기능 결합방향
++num 값을 1 증가 후, 속한 문장의 나머지를 진행(선 증가, 후 연산)
예)val = ++num;
num++ 속한 문장을 먼저 진행한 후, 값을 1 증가(선 연산, 후 증가)
예)val = num
--num 값을 1 감소 후, 속한 문장의 나머지를 진행(선 감소, 후 연산)
예)val = --num;
num-- 속한 문장을 먼저 진행한 후, 값을 1 감소(선 연산, 후 감소)
예)val= num--;

++ 연산자와 -- 연산자는 이름 그대로 값을 1 증가 및 감소 시키는 연산자이다. 그런데 이 두 연산자는 삽입된 위치에 따라서 그 의미가 달라진다. 피연산자의 왼편에 붙는 경우에는 (++num, --num), 먼저 변수에 저장된 값을 증가 및 감소 시키고 나서 문장의 나머지 부분을 실행하게 된다. 반면, 피연산자의 오른쪽에 붙는 경우에는 (num++ , num--),  문장 전체를 실행한 다음에 값을 증가 및 감소 시키게 된다. 

<OperatorFour.c>

#include <stdio.h>

int main(void)
{
   int num1 = 12;
   int num2 = 12;
   printf("num1: %d \n", num1);
   printf("num1++: %d \n", num1++);  // 후위 증가
   printf("num1: %d \n\n", num1);
   
   printf("num2: %d \n", num2);
   printf("++num2: %d \n", ++num2); // 전위 증가
   printf("num2: %d \n", num2);
   return 0;
}

실행결과

<OperatorFive.c>

#include <stdio.h>

int main(void)
{
      int num1=10;
      int num2=(num1--)+2;  // 후위 감소
   
       printf("num1: %d \n" , num1);
       printf("num2: %d \n", num2);
          
       return 0; 
}

실행 결과

위 예제  int num2=(num1--)+2;에서는 변수 num1에 대해서 '선 연산, 후 감소'를 진행하고 있다. 그런데 이 연산의 앞과 뒤에 소괄호가 채워져 있다. C언어에서는 소괄호도 연산자이다. 그리고 이는 수학의 소괄호와 의미가 같다. 즉, 먼저 연산하라는 뜻이다. 

후위증가 및 후위 감소 연산시에는 '소괄호의 영향을 받지 않고, 다음 문자으로 넘어가야만 비로소 값의 증가 및 감소가 이뤄진다'

 

 

관계 연산자 ( <, >, ==, !=, <=, >=)

관계 연산자는 대소와 동등의 관계를 따지는 연산자이다. '비교 연산자'라고도 한다. 두개의 값을 비교하기 때문이다.

연산자 연산자의 기능 결합방향
< 예) n1 < n2 
n1이 n2보다 작은가?
> 예) n1 > n2
n1이 n2보다 큰가?
== 예) n1 == n2
n1보다 n2가 같은가?
!= 예) n1 != n2
n1과 n2가 다른가?
<= 예) n1 <= n2
n1이 n2보다 같거나 작은가?
>= 예) n1 >= n2
n1이 n2보다 같거나 큰가?

위의 관계 연산자들은 '조건을 만족하면 1을,  만족하지 않으면 0을 반환'한다. 그런데 여기서 말하는 1은 '참(True)'을, 0은 '거짓(False)'을 의미하는 대표적인 숫자이다. 따라서 다음과 같이 이야기하는 것이 더 일반적이다. 

"조건을 만족하면 '참(true)'을, 만족하지 않으면  '거짓(false)'을 반환한다.

이와 관련한 예제를 보자 

<OperatorSix.c>

#include <stdio.h>

int main(void)
{
    int num1 = 10;
    int num2 = 12;
    int result1, result2, result3;
    result1 = (num1==num2);
    result2 = (num1<=num2);
    result3 = (num1>num2);

    printf("result1: %d \n", result1);
    printf("result2: %d \n", result2);
    printf("result3: %d \n" , result3);
    return 0;
}

OperatorSix.c 실행결과

 

논리 연산자(&&, ||, !)

논리 연산자란 AND(논리곱), OR(논리합), NOT(논리부정)을 표현하는 연산자이다.

연산자 연산자의 기능 결합방향
&& 예) A && B
A와 B 모두 '참'이면 연산결과로 '참'을 반환(논리 AND)
|| 예) A || B
A와 B 둘 중 하나라도 '참'이면 연산결과로 '참'을 반환(논리 OR)
! 예)!A
A가 '참'이면 '거짓', A가 '거짓'이면 '참'을 반환(논리 NOT)

 

<OperatorSeven.c>

#include <stdio.h>

int main(void)
{
    int num1 = 10;
    int num2 = 12;
    int result1, result2, result3;

    result1 = (num1==10 && num2==12);
    result2 = (num1<12 || num2>12);
    result3 = (!num1);

     printf("result1 : %d \n" , result1);
     printf("result2: %d \n" , result2);
     printf("result3: %d \n" , result3);
     return 0;
}

OperatorSeven.c 실행 결과

result3 = (!num1); 이 문장은 논리 NOT 연산의 예를 보여준다. 따라서 num1에 1이 저장되어 있다면 result3에는 0이 저장되고, num1에 0이 저장되어 있다면 result3 에는 1이 저장된다. 그렇다면 0도 1도아닌 다른 값이 저장되어 있다면 result3에는 어떤 값이 저장되겠는가? 이와 관련해서 다음 사실을 알 필요가 있다.

"C언어는 0이 아닌 모든 값을 '참(true)'으로 간주 한다. 

즉, '거짓'을 의미하는 숫자는 유일하게 0 하나이고, 0이 아닌 모든 숫자는 '참'으로 인식된다. 다만, 그중에서도 '참'을 의미할 때 주로 사용되는 숫자가 1이고, 그래서 연산의 결과로 '참이' 반환되어야 할 떄 1이 반환되는 것 뿐이다. 그리하여서 result3에 0이 저장이 된 것이다.

 

콤마 연산자( , )

콤마 연산자는 둘 이상의 변수를 동시에 선언하거나, 둘 이상의문장을 한 행(line)에 삽입하는 경우에 사용되는 연산자이다. 뿐만 아니라, 둘 이상의 인자를 함수로 전달할 때도 인자의 구분을 목적으로 사용된다. 즉, 콤마 연산자는 다른 연산자들과 달리, 연산의 결과가 아닌 '구분'을 목적으로 주로 사용된다.

<CommaOp.c>

#include <stdio.h>

int main(void)
{
   int num1 = 1, num2 = 2;
   printf("Hello "), printf("world ! \n");
   num1++, num2++;
   printf("%d ", num1) , printf("%d" , num2), printf("\n" );
   return 0;
}

CommaOp.c의 실행결과

연산자의 우선순위와 결합방향

결합방향 : 우선순위가 동일한 두 연산자가 하나의 수식에 존재하는 경우, 어떠한 순서대로 연산하느냐를 결정해 놓은 것

그렇다면 사칙연산의 결합방향은 무엇이라고 말할 수 있을까? 이들 수학 연산자는 왼쪽에 있는 연산자부터 오른쪽에 있는 연산자의 순으로 진행을 하므로, '왼쪽에서 오른쪽' 이라고 말할 수 있다. 즉 이를 화살표로 표시하면 →이 된다. 

출처:http://blog.naver.com/wnsgh224/120171590219

 

덧셈 프로그램의 구현에 필요한 + 연산자

'덧셈' 하면 흔히 생각하는 것이 +기호이다.  +기호가 프로그램에서 받아들여 지겠는가? 이를 확인해보는 예제를 보자.

SimpleAddOne.c

#include <stdio.h>


int main(void)
{
   3+4; // 3과 4의 합을 명령함
   return 0;
}

위 예제는 문제 없이 컴파일 된다. 이렇듯 C언어를 이용해서 특정연산을 요구할 때 사용하는 약속된 기호를 가리켜  '연산자(operator)'라고 한다.

변수를 이용한 데이터의 저장

수학에서는 정해지지 않은, 그래서 임의의 값을 대입할 수 있는 문자를 가리켜 변수라 한다. 이와 유사하게 C언어의 변수가 의미하는 바도 다음과 같다.

값을 저장할 수 있는 메모리 공간에 붙은 이름, 혹은 메모리 공간 자체를 가리켜 변수라 한다."

<변수의 선언 방법>

int main(void)

      int num; // num이라는 이름의 변수선언
 
}

위 예제에서  int num; 이 문장이 변수의 선언문이다.

이 문장을 구성하는 int와 num이 의미하는 바는 각각 다음과 같다.

  • int    정수의 저장이 가능한 메모리 공간을 할당합니다.
  • num 그리고 그 메모리 공간의 이름을  num이라 합니다.

변수 num을 선언한 다음에는 num이라는 이름을 이용해서 값을 저장하고 참고 할수 있다.

int main(void)
{
   int num;  // num이라는 이름의 변수선언
   num=20; // 변수 num에 20 저장
   printf("%d", num); // 변수 num의 값 참조
  
}

C언어에서 = 기호는 값의 대입을 뜻한다.  이 기호를 가리켜 '대입 연산자'라 하며, 대입 연산자의 오른편에 오는 값을 왼편에 오는 변수에 저장하는 형태로 사용이 된다. 

 

변수의 다양한 선언 및 초기화 방법

선언된 변수에 처음 값을 저장하는 것을 가리켜 '초기화'라 한다. 그리고 초기화 이후에 저장된 값을 변경 할 때에는 그냥 '대입' 또는 '대입연산'을 진행한다고 한다.

int main(void)
{
  int num; //num이라는 변수의 선언
  num=12;  // 변수 num을 12로 초기화
  num=24;  //  변수 num에 24를 대입 
}

그런데 C언어에서는 다음과 같이 변수를  '선언과 동시에 초기화' 하는 것이 가능하다.

int num =12;

위의 문장을 실행하게 되면, 변수  num이 메모리 공간에 할당되자마자 12로 초기화된다. 

int num1, num2 //두개의 변수를 선언

int num3=30, num4=40; // 두개의 변수를 선언 및 초기화

위와 같이 둘이상의 변수를 동시에 선언하는 것도 가능하고, 동시에 선언 및 초기화 하는 것도 가능하다.

VarDeclAndlnit.c

#include <stdio.h>

int main(void)
{
   int num1, num2;    //변수 num1,num2의 선언
   int num3=30, num4=40; //변수 num3, num4의 선언 및 초기화

   printf("num1: %d, num2:%d \n", num1, num2);
   num1=10;  //변수 num1의 초기화
   num2=20;  //변수 num2의 초기화

  printf("num1: %d, num2: %d \n", num1, num2);
  printf("num3: %d, num4: %d \n", num3, num4);
  return 0;
}

실행 결과. 책의 예제 실행결과는 첫번째 num1, num2의 값이 쓰레기 값이 나와야하는데 나의 컴퓨터에서는 0으로 나온다..

위의 예제는 변수의 선언 및 초기화 방법 뿐만 아니라 다음의 사실도 말해준다

변수를 선언만 하고 초기화 하지 않으면 쓰레기 값이 저장된다.

여기서 말하는 쓰레기 값이란 '아무런 의미가 없는 값'을 뜻한다.  가급적 이러한 쓰레기 값이 변수에 저장되지 않도록 하는 것이 좋다. 

변수선언 시 주의할 사항

중괄호 내에 변수를 선언할 경우, 변수의 선언문은 중괄호의 앞부분에 위치해야 한다. 

C언어에서의 중괄호는 영역이나 내용을 구분하는 목적으로 사용된다.  중괄호의  시작부분에 변수의 선언문이 위치해야 한다. 

다음과 같은 코드는 컴파일 에러를 발생시키지 않는다.

int main(void)
{
   int num1;
   int num2;
   num1=0;  // 변수선언 이후에 등장한 초기화 문장
   num2=0;  // 변수선언 이후에 등장한 초기화 문장
}

변수  num1과 num2의 선언문 앞에 다른 어떠한 문장도 존재하기 않기 때문에 컴파일 에러를 발생시키지 않는다. 

하지만 다음과 같은 코드는 컴파일 에러를 발생시킨다.

int main(void)
{
   int num1;
   num1=0;  //이 문장은 변수의 선언문이 아니다.
   int num2; // 컴파일 에러가 발생하는 지점
   num2=0;
}

위의 경우는 변수 num2의 선언문 앞에 변수의 선언이 아닌 문장이 등장했기 때문에 컴파일 에러가 발생한다. 따라서 중괄호의 앞부분에 변수의 선언문이 오도록 해야 한다. 참고로 1999년도에 발표된 C언어의 표준에서는 변수의 선언위치에 아무런 제한을 두고 않고 있다. 따라서 위의 코드도 컴파일이 되어야 정상이지만 최근에 발표된 컴파일러를 비롯해서, 아직도 상당수의 컴파일러가 변수의 선언문이 중괄호의 앞부분에 일치할 것을 요구하고 있다.

변수 선언시 주의해야 할 두 번째 사항은 변수의 이름에 관한 것이다. 다음은 변수의 이름을 지을 때 적용되는 규칙들이다.

  • 첫째  변수의 이름은 알파벳, 숫자, 언더바(_)로 구성된다.
  • 둘째  C언어는 대소문자를 구분한다. 따라서 변수 Num과  변수 num은 서로 다른 변수이다.
  • 셋째  변수의 이름은 숫자로 시작할 수 없고, 키워드도 변수의 이름을 사용할 수 없다.
  • 넷째  이름 사이에 공백이 삽입될 수 없다.
변수의 이름을 정할 때에는 변수의 역할에 어울리는, 의미 있는 이름을 지어야한다.

예를 들어, 나이를 저장할 목적의 변수를 선언하는 경우, 변수의 이름으로는 age가 num보다 더 잘 어울린다. 

이렇듯 용도를 파악할 수 있는, 의미 있는 이름을 지어주려고 노력해야한다. 그래야 이해하기 쉬운 , 분석이 용이한 프로그램이 되기 때문이다. 

 

변수의 자료형(Data Type)

변수는 다음과 같이 크게 두가지 부류로 나뉜다

  • 정수형 변수 : 정수의 저장을 목적으로 선언된 변수
  • 실수형 변수: 소수점 이하의 값을 지니는 실수의 저장을 목적으로 선언된 변수 

변수의 종류가 크게 두 가지로 나뉘는 이유는 정수냐, 실수냐에 따라서 값이 메모리 공간에 저장 및 참조되는 방식이 다르기 때문이다. 그리고 정수형 변수는 변수의 크기에 따라서 char형, short형, int형, long형 변수로 나뉘고, 실수형 변수도 크기에 따라서 float형 변수와 double형 변수로 나뉜다. 

 

덧셈 프로그램의 완성

예제 SimpleAddOne.c를 덧셈 프로그램으로 변경해보고자한다. 두변수에 저장된 값을 대상으로 덧셈을 진행하고, 그 결과를 변수에 저장해서 다양한 형태로 출력해보겠다.

#include <stdio.h>

int main(void)
{
    int num1=3;
    int num2=4;
    int result=num1+num2;

    printf("덧셈 결과: %d \n", result);
    printf("%d+%d=%d \n", num1, num2, result);
    printf("%d와(과) %d의 합은  %d입니다. \n", num1, num2, result);
    return 0;
}

실행 결과

printf 함수를 이용한 정수의 출력과 서식 문자

printf 함수를 이용하면 문자열 이외의 데이터와 정수를 다양한 형태로 출력하는 것이 가능하다.

예제 PrintfOne.c

#include 

int main(void)
{
printf("Hello Everybody\n");
printf("%d\n", 1234);
printf("%d %d\n", 10, 20);
return 0;
}

 

예제 PrintfOne.c 실행결과

실행결과를 통해서 printf 함수를 이용하여 문자열도, 정수 데이터도 출력이 가능함을 알 수 있다. 

%d 와 같은 문자를 가리켜 '서식문자(conversionspecifier)'라 하는데, 이는 출력의 형태를 지정하는 용도로 사용이 된다. 

출력의 형태를 다양하게 조합하는 것이 가능하다.

예제 PrintfTwo.c

#include <stdio.h>

int main(void)
{
   printf("My age:%d \n" , 20);
   printf("%d is my point \n" , 100);
   printf("Good \nmorning \neverybody\n");
   return 0;
}

예제 PrintfTwo.c 실행 결과

이렇듯 서식문자의 삽입 위치에는 제한이 없어서 다양하게 문자열을 조합해서 출력하는 것이 가능하다.


문제02-2[printf 함수의 다양한 활용]

문제1: 다음의 출력결과를 보이도록 예제를 작성해보자. 단, 출력되는 숫자들(20, 123, 456)은 서식문자 %d를 이용하여 출력하도록 하자.

제 이름은 홍길동입니다.

제 나이는 20살 이고요.

제가 사는 곳의 번지수는 123-456입니다. 

결과

문제 2: 다음의 출력결과를 보이도록 예제를 작성해보자. 이번에도 역시 출력되는 숫자들은 서식문자 %d를 이용해서 출력하도록 하자.

4x5=20

7x9=63

결과

주석(comment) : 프로그램 내에 삽입된 메모를 뜻함.

블록 단위 주석

주석의 시작과 끝을 명시하는 방식이다. 시작은 /* 으로 명시해 끝은 */으로 명시한다. 

/* 주석처리 된 문장 */         

  이와 같이 한줄도 가능하고

/*  주석처리 된 문장1

    주석처리 된 문장2

     주석처리 된 문장3  */      

이 처럼 두 줄 이상을 주석처리 하는데도 사용 가능하다.

행 단위 주석 

// 주석처리 된 문장1

// 주석처리 된 문장2

// 주석처리 된 문장3

예시 처럼 // 뒤에 등장하는 문장은 주석으로 처리된다.

예제 Hello.c에 주석 추가 하기

#include <stdio.h> // 헤더파일 선언

int main(void) // main 함수의 시작
{
    /* 
       이 함수내에서는 하나의 문자열을 출력한다.
       문자열은 모니터로 출력된다.
    */
     printf("Hello world! \n");  // 문자열의 출력
  return 0;   // 0의 반환
}      // main 함수의 끝

 

주석처리에 있어서의 주의점 

블록 단위 주석은 중첩될 수 없다.

ex)

/*
   주석처리 된 문장1
   /* 단일 행 주석처리 */
   주석처리 된 문장2
*/

그러나 다음과 같이 행 단위 주석은 블록 단위 주석의 내부에 포함될 수 있다.

/*
   주석처리된 문장1
   // 단일 행 주석처리
   주석처리 된 문장2
*/

 

예제 Hello.c

#include <stdio.h>
int main(void)
{
     printf("Hello world! \n");
     return 0;

}

C언어의 기본단위인 '함수'의 이해

3x+4 = y

위 함수의 x에 2를 대입하면 y는 얼마인가? 10이다.

C언어에서는 x에 삽입되는 값을 '입력'하고, 그 결과로 얻게 되는 y의 값을 '출력'이라고 한다. 그리고 적절한 입력과 그에 따른 출력이 존재하는 것을 가리켜 '함수(function)'이라 한다. 

C언어에서 함수와 관련해서 사용되는 용어 몇 가지 정리 !

  • 함수의 정의 : 만들어진 함수, 실행이 가능한 함수를 일컬음
  • 함수의 호출 : 함수의 실행을 명령하는 행위
  • 인자의 전달 : 함수의 실행을 명령할 때 전달하는 입력 값 

 

예제 Hello.c에서의 함수는 어디에?

C프로그램은 함수로 시작해서 함수로 끝난다. 즉, 정해진 순서에 의해서 진행되는 함수의 호출이 바로 프로그램의 흐름이 되는 것이다. 그렇다면 제일 먼저 호출되는 함수는 무엇일까? 바로 main이라는 이름의 함수이다. 프로그램이 실행되자마자 컴퓨터는 main이라는 이름의 함수를 찾아서 호출을 한다. 따라서 C언어로 구현된 모든 프로그램에는 main이라는 이름의 함수가 정의되어야 한다. 

int main (void)
출력형태 함수이름 입력형태

위의 표가 의미하는 바는 다음과 같다.

출력의 형태가 int이고 입력의 형태가 void인 main이라는 이름의 함수

이렇듯 함수의 특성(입력형태, 출력형태 그리고 함수 이름)만 정의했다고 해서 함수가 되는 것은 아니다. 함수는 기능을 지녀야한다. 

맨위 예제의 중괄호 내부는 두 개의문장으로 이뤄져 있는데,  이 문장들은 순차적으로 실행이 된다. 즉, 중괄호내에 존재하는 문장은 그 수에 상관없이 위에서 아래로 순차적으로 실행이 된다. 

이렇게 함수의 기능을 정의하고 있는 영역을 가리켜 '함수의 몸체(body)'라 한다. 

함수 내에 존재하는 문장의 끝에는 세미콜론 문자 ; 을 붙여준다.

main의 함수의 몸체는 다음 두 문장으로 이뤄져 있다.

printf("Hello world! \n");

return 0;

각 문장 끝에는 세미콜론 문자 ; 가 붙어있다. 이렇듯 C언어는 문장의 끝을 표현하기 위해서 세미콜론을 사용한다. 그런데 모든 문장에 세미콜론이 붙는 것은 아니고 조건문이나 반복문 같은 컨트롤 문장에는 세미콜론이 붙지 않는다. 

표준 라이브러리와 printf 함수

main 함수의 몸체에는 다음 문장이 존재한다. 

printf("Hello world! \n");

함수의 호출문에서 소괄호 안에는 함소호출 시 전달할 인자정보를 표현한다. 그리고 C언어는 큰따옴표를 이용해서 문자열을 표현한다. 즉, 위 문장은 문자열 "Hello world! \n"을 인자로 전달하면서 printf라는 이름의 함수를 호출하는 문장이다.

printf 함수는 함수 호출 시 전달되는 문자열을 모니터에 출력하는 기능을 지닌다. 이러한 printf 함수는 직접 만들지 않아도 호출이 가능한, 기본적으로 제공되는 함수이다. 즉, 누구나 가져다 쓸 수 있도록 이미 만들어져 있는 함수이다. 이렇듯 제공되는 함수를 가리켜 '표준함수'라고 하고 , 표준함수들의 모임을 가리켜 '표준 라이브러리'라 한다.

현 시점에 어울리는 '헤더파일 선언의 필요성'에 대한 설명

printf 와 같은 표준함수의 호출을 위해서는 printf 함수와 관련 있는 '헤더파일 선언'이라는 것을 해야한다. 앞서 보인 예제의 헤더파일 선언은  #include <stdio.h> 이다.

이는 stdio.h라는 , 확장자가 .h로 끝나는 헤더파일을 포함하라는 의미의 선언이다.

  • printf 함수의 호출을 위해서는 stdio.h를 대상으로 헤더파일 선언을 해야 한다.
  • 헤더파일의 선언은 소스파일의 맨 앞 부분, main 함수 정의 이전에 와야 한다. 

return은 함수의 종료와 값의 전달(반환)이라는 두 가지 의미를 지닌다. 

main 함수의 다음 두 번째 문장은 return 0; 이다

이를 가리켜 return문이라 하는데, 이 문장이 지니는 두가지 의미는 다음과 같다.

  • 함수를 호출한 영역으로 값을 전달(반환)
  • 현재 실행중인 함수의 종료

따라서 예제 Hello.c에서는 이 문장을 실행하면서 main 함수를  호출한 영역으로 0을 전달한다. 그리고 함수를 빠져 나온다. 그런데 main 함수의 종료는 프로그램의 종료로 이어지기 때문에 결국 프로그램이 종료가 된다. 

 


참고- main 함수의 return문

main 함수의 마지막에서 0을 전달(반환)하는 이유는 무엇일까 ? 이값은 main 함수를 호출한 영역으로 전달된다. 그런데 main 함수는 프로그램이 시작되면 자동으로 호출되는 함수이다. 그리고 호출의 주체는 Window나 Linux와 같은 운영체제이다. 따라서 0은 운영체제에게 전달된다. 그리고 그 값은 프로그램의 종료상태를 알리는 용도로 사용된다. 보통 0은 정상적인 종료의 상황에서 전달하는 값이다. 반면 비정상적인 상황으로 인해서 종료될 때에는 일반적으로 0이 아닌 값을 전달한다.


 

문제 02-1 [예제 변경해보기]

문제1 : 다음과 같은 형태로 본인의 이름을 출력하는 프로그램을 작성해 보자. 단, printf 함수는 한 번만 호출해야 한다.

홍길동

홍 길 동

홍  길  동 

결과

문제2: 본인의 이름, 주소 그리고 전화번호를 모니터에 출력하는 프로그램을 작성해 보자. 더불어 이스케이프 시퀀스 \n 을 적절히 삽입해서 출력형태로 보기 좋게 다듬기 바란다. 총 3번 printf 함수를 호출해서 문제를 해결하자.

개인정보로 인하여 ㅎㅎ..
결과

+ Recent posts