2장 C언어의 기초

[식별자]
- 식별자 : 변수, 함수, 상수와 같은 프로그램 구성 요소의 이름
- 식별자 생성규칙
   규칙: 영문자, 숫자, 밑줄문자로 구성, 숫자로 시작하지 않음
   옮은 예: sum, x2000, tax_rate1, Table
   잘못된 예: 4th(숫자로 시작안됨), "x"("로 시작), tax-rate(-안됨), id@host(@안됨)
- ANSI 표준은 31자까지 구별, 일부 컴파일러는 8자까지 구별
   tax_rate1과 tax_rate2는 일부 컴파일러에서는 같은 식별자로 인식(9자라서 뒤에 숫자부분은 짤림)
- 권장사항
   의미를 알 수 있게 부여할 것
   두 단어를 결합한 식별자는 밑줄문자 또는 대문자로 구분함

[예약어]
- 예약어: C언어에서 특별한 용도로 미리 예약된 이름, 키워드, 식별자로 사용 불가능
- 예약어의 예
   자료형: char short int long unsigned float double struct union typedef enum void const signed
   제어문: if else switch case default for while do break continue goto return
   기억장소: auto register static extern volatile
   연산자: sizeof
- 일부 컴파일러에서 사용하는 예약어
  ada, fortran pascal asm
  entry near far huge

[자료형]
- 자료형: 정수, 실수, 문자
   cf) 정수 1과 실수 1의 컴퓨터 내부 표현은 다르다. 문자는 컴퓨터 내부에서 정수로 표현된다.
- C언어의 기본 자료형
  int         정수
  char      문자
  float      실수(보통 정밀도) - 4byte - 32bit
  double  실수(2배 정밀도)   - 8byte - 64bit
  ex) double x;    ... 64bit까지 표현 가능한 실수로 표현
        char c;      .... 문자 변수

[자료형의 표현범위]
- int 자료형
  컴퓨터와 컴파일러에 따라서 16bit 또는 32bit로 표현됨 (우리가 쓰는 컴퓨터는 보통 32bit이다)
  16bit 정수: -32,768(2^15) ~ 32,767(2^15-1)
  32bit 정수: -2,147,483,648(2^31) ~ 2,147,483,647(2^31-1)
- float, double 자료형(실수 표현)
                                 유효숫자        지수범위                   ※ 유효숫자 x 10^지수
  float(32-bit 실수)          6자리          -38 ~ 38
  double(64-bit 실수)      15자리         -308 ~ 308
-char 자료형 (책 409p - ASCII Code; 대문자 A: 65, 소문자 a: 97)
  문자는 8-bit 표기   cf)한글은 16bit
  char 자료형은 8bit 정수 표기에 사용가능
  8 bit 정수: -128 ~ 127

[자료형 수정자]
- 자료형 수정자(modifier)
  자료형 앞에 붙여서 자료형의 표현 범위를 변경
  long int                 긴 정수(32-bit)    ...20년전 컴파일러에는 유용. 16bit 컴퓨터에서 표현이 안되면...
  short int                짧은 정수(16-bit) ... 요즘 컴퓨터는 디폴드가 32bit이기 때문에 적은 자료형 표현에 good
  unsigned int          부호 없는 정수 -> 양수의 표현 범위 2배 증가
  unsigned long int   부호 없는 긴 정수(32-bit)
  unsigned short int  부호 없는 짧은 정수(16-bit)

  자료형 수정자와 함께 사용하는 int는 생략 가능
  long int a;   =   long a;
- unsigned 정수의 표현 범위
  16bit unsigned
  32bit unsigned

사용자 삽입 이미지
연습문제1
현재 자신의 PC가 지원하는 int, char, long, short, float, double 자료형의 크기가 몇 바이트인지 확인해보는 프로그래밍을 해보시오
hint.: sigeof() 함수를 이용하시오

#include <stdio.h>

int main(void)
{
 printf("Size of int is %d \n",sizeof(int));
 printf("Size of char is %d \n",sizeof(char));
 printf("Size of long is %d \n",sizeof(long));
 printf("Size of short is %d \n",sizeof(short));
 printf("Size of float is %d \n",sizeof(float));
 printf("Size of double is %d \n",sizeof(double));
 return 0;
}

====== 결과 값 ======
Size of int is 4
Size of char is 1
Size of long is 4
Size of short is 2
Size of float is 4
Size of double is 8
Press any key to continue
====================

[상수]
- 상수(constant): 편하지 않는 명시적인 자료
- 정수상수: 12   056(8진수)   0x4f(16진수)
- 실수상수: 3.14   1.0    1.5e5
- 문자상수: 'A'    '1'(문자 1이 되면 ASCII값을 같는다)    '\n'    '@'    '한'(한글은 2byte라서 쓰면 안된다)
- 문자열상수: "Korea"    "대한민국"    "한"
   cf) 컴파일러가 "KOREA"를 저장할때  'K''O''R'"E''A''\0' 이렇게 들어간다.

[정수 상수]
- 정수 상수
  10진수: 1~9로 시작하여 표현
  8진수: 0으로 시작하여 표현
  16진수: 0x 또는 0X로 시작하여 표현
  정수 상수는 기본적으로 int형으로 표현됨
  정수 상수가 int형 표현 범위를 넘어서면 컴파일러 판단에 의해서 unsigned 또는 long 형으로 표현됨
- 정수형 지정 접미사 U,L
   1234           int형 정수
   1234L         long형 정수
   40000U       unsigned형 정수
   40000UL     unsigned long형 정수

[실수 상수]
- 실수 상수
   소수점을 포함한 숫자
   3.14
   1.0    =   1.
   0.12   =    .12
  
   과학용 표기법
   6.2e3(=6.2x10^3)  =   6.2E3
   4e-2(=4x10^-2)
 
   실수 상수는 기본적으로 double형으로 표현됨

- float형 지정 접미사 F
   6.2       .....double형 실수
   6.2F     ..... float형 실수

[문자 상수]☆★
- 문자상수: 영문자, 숫자, 특수문자를 작은 따옴표('  ')로 묶어서 표시
- ASCII코드
  문자에 대응되는 정수값을 정한 미국 표준 코드
  ASCII코드는 8-bit 정수로 표현
  ASCII코드의 순서는 숫자와 알파벳 순서와 같음
  '0'과 0은 다르다.    '0'은 정수 48과 같음

연습문제2
하나의 문자를 입력받아 그 문자의 ASCII 코드를 출력하는 프로그램을 작성해 보시오.
hint: scanf()를 이용하여 문자를 입력 받으시오

#include <stdio.h>

int main(void)
{
 char ch;
 printf("ASCII코드로 변환할 문자를 입력해주세요 : ");
 scanf("%c",&ch);
 printf("%c의 ASCII 코드는 %d 이다.\n",ch,ch);
 return 0;
}

======= 결과 값 ========
ASCII코드로 변환할 문자를 입력해주세요 : a
a의 ASCII 코드는 97이다.
Press any key to continue
=======================

[백슬래시 코드]
- 백슬래시 코드 (탈출순서 표시)
  제어용 문자와 문자 표현에 특수한 용도로 사용되는 문자는 backslash(\)와 함께 나타냄   ex)'\n' '\t'
  컴퓨터 내부적으로는 한 문자로 표현됨
- 화면에 출력되지 않는 제어용 문자
  \n      new line: 개행문자(다음줄로)
  \r       줄 처음으로
  \t       tab
  \b      backspace
  \0      null문자(정수 0에 대응되는 문자)
- C언어에서 특수한 용도로 사용되는 문자
  \"      큰 따옴표"
  \'      작은 따옴표'
  \\    backslash \
- 8, 16진수 코드값 표기
  \101  8진수 코드로 표현된 문자(10진수 65 'A')
  \x42  16진수 코드로 표현된 문자(10진수 66 'B')

연습문제3
백슬래쉬 코드와 printf()함수를 이용하여 Mr Kim said " a \ is a backslach."를 출력하는 프로그래밍을 해보시오.

#include <stdio.h>

int main(void)
{
 printf("Mr Kim said \" a \\ is a backslash.\"\n");
 return 0;
}
======= 결과 값 =======
Mr Kim said " a \ is a backslach."
Press any key to continue
======================

[문자열 상수]
- 문자열 상수: 연속된 문자들은 큰 따옴표로("  ")로 묶어서 표시
   ex) "Korea"
- 문자열의 표현: 문자열은 컴퓨터 내부에서 null 문자로 끝나는 연속적인 문자들로 표현
   ex) "Korea" -> 'K''o''r''e''a''\0'
- 주의사항
   "a"는 'a''\0'으로 구성되므로 'a'와 같지 않음
   null 문자열 ""은 '\0'만으로 구성되는 문자열임

[기호 상수]
- 기호상수
  상수에 부여한 이름
  #define을 사용하여 기호상수 정의
  여러 번 사용하는 상수나 값이 바뀔 수 있는 상수에 대해서 유용함

[변수] : 메모리 할당이다!
- 값을 저장할 수 있는, 이름이 부여된 기억장소
- 변수의 선언
   변수를 사용하기 전에 반드시 변수의 자료형을 선언해야 함.
   int p;
   float a, b, c;    ..... 여러 개의 같은 자료형의 변수 선언
   변수를 선언하면 변수의 메모리 공간이 확보됨
   변수 선언 위치: 함수의 시작 부분(다른 위치는 나중에 다룸)
   int main(void)
   {
       변수선언
       프로그램 실행문
    }
   (cf) C++ 언어에서는 변수를 사용하기 전에만 변수 선언을 하면 됨

[변수의 초기화]
- 변수는 초기값을 지정한 다음에 사용해야 함
   int a;
   ...
   b = a;  (X) .... a의 값이 정의되지 않았으므로 잘못

- 실행문에서 초기화
   int a;
   ...
   a = 25;

- 변수의 초기화 선언
   int a = 25;
   float data, sum = 0.0, average;     ...sum만 초기화(권장하지 않음: data와 average에 대한 초기화를 안하고 까먹을 수도 있다.)

[주석]
- 주석(comment)
   /* 코딩과는 관련없고 개발자가 이해하기 쉽도록 남기는 글 */    ..../*   */로 둘러쌓인 부분
   설명문으로서 컴파일러에 의해서 무시됨
   프로그램 저작권, 수정이력, 동작 설명 등의 문서화 용도로 사용
   ex)
   /* hello.c
   * 내용: 자료를 순서대로 나열한다.
   * ver 0.0: 03/6/10 작성자: 홍길동
   */
   int sum;    /* 자료들의 합 */
   int max;    /* 최대값 */
- C++ 주석
  // C++ comment                     ...// 부터 시작하여 줄 끝까지가 주석
  ex) int sum;    //자료들의 합

[수식]
- 수식: 상수, 변수, 함수 호출 또는 이들과 연산자와의 조합
  10          ... 상수
  x            ... 변수
  sin(x)     ... 함수호출     -> x는 라디안 값.  적용전에 #include <math.h>(?)를 헤더에 넣어야 함
  x + 10*y  ...  이들과 연산자와의 조합
- 수식의 값
  대부분의 수식은 값을 가짐, (예외) 반환 값이 없는 함수 호출
  수식의 연산들은 정해진 순서대로 수행하며 수식의 최종 연산 결과가 수식의 값이 됨

[치환문]
- 치환문
   c = a + 10;        ... 오른쪽 수식의 값을 왼쪽 변수에 저장  ('='이 중요)
- 치환 연산자 '='
   C언어에서는 =도 연산자로 취급
   =을 치환연산자 또는 배정 연산자라고 함
   =는 수학적 등호가 아님
   k = 5;
   k = k+1;      .....k에 6이 저장됨
- 치환 수식
   치환 수식: 치환 연산자를 포함한 수식
   왼쪽 변수에 저장되는 값이 치환 수식의 값이다.
   k = 10 + 5;    .....k 값에 15가 저장됨

[연산자]
- 연산자
   변수, 상수, 함수 호출 값(피연산자: 연산의 대상)에 대해서 연산을 수행하여 결과를 제공
   연산은 기본적으로 같은 자료형에 대해서 수행함
       정수들 간의 연산 결과 --> 정수
       실수들 간의 연산 결과 --> 실수
- 산술연산자
   + 덧셈
   - 뺄셈
   * 곱셈
   / 나눗셈        ..... 11/4 = 2         11.0/4.0 = 2.75
   % 나머지       ..... 11%4 = 3
   나머지 연산은 정수에 대해서만 사용 가능

[연산 우선순위와 결합성]
- 연산 우선 순위
  수식에 두 종류 이상의 연산자가 포함되어 있을 때에 연산을 평가하는 순서
   ex) a + b * c  ....b * c 우선 계산
- 결합성
   같은 우선 순위의 연산자에 대한 연산 실행 순서
   좌결합성: 앞(왼쪽)에서 부터              ....a+b-c  -> (a+b)-c
   우결합성: 뒤(오른쪽)에서 부터           .... a = b = c ->a = (b = c)
주요 연산자의 우선순위와 결합성
우선순위    연산자     결합성
     1          괄호()      좌
     2           단항 -        우
     3          * / %       좌
     4           +  -         좌
     5             =             우

[여러가지 수식과 다중 치환문]
pow(a,b) = a^b
- (예) 수학식에 대한 C언어 수식
    b^2-4ac ------> b*b-4.0*a*c
    2x + 1/2 y - 1/z^2  ----> 2.0*x + y/2.0 - 1.0 / (z*z)
- 다중치환문
   x = y = 5     ---> y= 5  ---> x = 5  ---> x, y에 5 저장

[자료형 변환]
- 자료형 자동 변환
   1.0 + 2 -> 1.0 + 2.0 = 3.0     ..... 자료형을 같도록 한 후에 연산 수행
- 수식에서의 자료형 변환
   먼저 작은 정수는 보통 정수로 형 변환
   char, short                               -> int
   unsigned char, unsignedshort    -> unsigned
- 이항 연산의 피연산자는 둘 중 큰 자료형으로 변한됨
   int < unsugned < long < unsigned long < float < double
   ex) s/i+f /d -> i / i + f /d = i+f/d ->i + d/d = i+d -> d+d=d  ====> 결과치가 double로 나온다.
        (s: short, i: int, f:float, d:double)

사용자 삽입 이미지


[형 변환 연산자]
- 수식의 값의 자료형을 명시적으로 변환하는 연산자
   (double)num
   (double)(a+b*c)
- 형 변환 연산자(type)은 단항연산자 우선순위
   (double) a/4 -> ((double)a) /4     ....형 변환 후 나눗셈
   (double)(a/4)                             .... 나눗셈 후 형 변환


사용자 삽입 이미지
1번
#include <stdio.h>
int main(void)
{
 float a,b;
 printf("C = 5/9*(F-32)\n");
 printf("화씨 온도를 입력하세요 : ");
 scanf("%f",&a);
 b = 5.0/9.0*(a-32);
 printf("환산된 섭씨 온도는 %f 입니다. \n",b);
 return 0;
}

2번
#include <stdio.h>
int main(void)
{
 int a,b,c;
 printf("분(minute)을 입력하시오 :");
 scanf("%d",&a);
 b=a/60;
 c=a%60;
 printf("%d분은 %d시간 %d분 입니다.\n",a,b,c);
 return 0;
}

3번
#include <stdio.h>
int main(void)
{
 float a,b,c,d;
 printf("이제부터 실수 a,b,c에 대한 합을 계산합니다.\n");
 printf("먼저 a의 값을 입력해주세요.");
 scanf("%f",&a);
 printf("다음으로 b의 값을 입력해주세요.");
 scanf("%f",&b);
 printf("마지막으로 c의 값을 입력해주세요.");
 scanf("%f",&c);
 d=a+b+c;
 printf("입력하신 실수 %f, %f, %f의 합은 %f입니다.\n",a,b,c,d);
 return 0;
}

by Joe & Soohy 2006. 12. 27. 09:39