글
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
현재 자신의 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) .... 나눗셈 후 형 변환
#include <stdio.h>
{
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 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>
{
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;
}