C언어의 필수 4가지
32개(44개)의 keyword
- for, if, int 등
- C99에서는 37개
- C11에서는 44개
40여 개의 연산자
- +, -, *, / 등
10개의 구두점(토큰을 구분하는 용도)
- [] {} () ; : # * = , ...
printf()같은 표준 라이브러리 함수
예약어(reserved word, keyword)
컴파일러에 의해 미리 의미가 정해져 있는 32~44개의 단어
항상 소문자로만 사용(C99 이전)
| 기능별 분류 | 예약어 |
| 제어문(반복) | for, while, do |
| 제어문(선택) | if, else, switch, case, default |
| 제어문(점프) | break, continue, goto, return |
| 자료형 | char, int, short, long, float, double, signed, unsigned, struct, union, typedef, enum, void |
| 기억 클래스 | auto, static, extern, register |
| 기타 | const, sizeof, volatile |
연산자의 우선순위(precedence)와 결합성(associativity)
결합성(associativity)
- 우선순위가 같은 연산자의 결합 방향
| 우선순위 | 결합성 | 연산자 |
| 1 | → | ( ), [ ], ., ->, ++(후치), --(후치) |
| 2 | ← | (자료형), sizeof, *(참조), &, ++(전치), --(전치), +(부호), -(부호),~, ! |
| 3 | → | *(곱셈), /, % |
| 4 | +, - | |
| 5 | <<, >> | |
| 6 | <, <=, >, >= | |
| 7 | ==, != | |
| 8 | & | |
| 9 | ^ | |
| 10 | | | |
| 11 | && | |
| 12 | || | |
| 13 | ← | ? : |
| 14 | =, +=,-=,*=,/=,%=,<<=,>>=,&=,^=,|= | |
| 15 | → | ,(콤마) |
토큰(token) 과 구두점
토큰
- C 프로그램을 구성하는 기본 단위
- 예약어(reserved word, keyword) : int, if 등 44개
- 연산자(operator) : +, / 등 40여 개
- 구두점(punctuator) : [], () 등 50여개(40여 개는 연산자로 사용)
- 식별자(identifier) : 변수, 함수, 배열, 구조체 등의 이름
- 리터럴(literal) or 상수(constant) : 10, 3.5
- 문자열(string) : "hello"
구두점
- 토큰을 구분하기 위해 사용하는 기호
- [], (), {}, *, 콤마(,), ;, =, :,..., “”
자주 사용하는 구두점(punctuator)
| 구두점 | 명칭 | 용도 | 예 |
| [ ] | bracket, 대괄호 | 배열크기 지정 | char ch[10]; |
| { } | brace, 중괄호 | 블록(제어문, 함수) 배열 초기화 구조체 틀 |
if(x>y) { } int num[3]={1, 2, 3} struct SCORE { }; |
| ( ) | parenthesis, 소괄호 | 제어문의 조건식 함수의 매개변수 목록 |
if(x>y) printf("AAA"); |
| * | asterisk, 별표 | 포인터 변수 선언 | char *name; |
| , | comma, 쉼표 | 변수, 함수 선언 함수의 매개변수 나열 배열 초기화 |
int x,y; sum(x,y); int num[3]={1, 2, 3} |
| ; | semicolon, 세미콜론 | 문장의 끝 for문의 조건식 구분 |
int num; for(i=0;i<10;i++) |
| = | equal sign | 변수, 배열 초기화 | int num[3]={1, 2, 3} |
| : | colon, 콜론 | goto문에서 분기하는 레이블 case문의 레이블 다음 |
AAA: case 0 : |
| ... | ellipsis, 생략부호 | 함수원형에서 매개변수 생략 | int printf( const char *format [, argument]... ); |
| # | sharp, 샵 | 전처리기 | #include #define |
함수
C 프로그램은 함수(function)의 집합
특정한 작업을 하도록 만들어진 독립적인 단위 모듈
큰 프로그램 하나를 여러 개의 함수로 분할하여 구현하는 구조적 프로그래밍(structured programming) 방식의 기본
매개변수(parameter), 전달인자(인수, argument) : 함수에 입력시키는 것
반환값, 리턴값(return value) : 함수가 돌려주는 결과 값
C 프로그램의 기본 틀
콘솔 기반 C 프로그램은 main() 함수로 시작
main()함수는 콘솔 기반 C 프로그램의 시작점(entry point)
하나의 프로그램에 반드시 하나 존재
리턴값이 없는 함수나 매개변수가 없는 함수는 그 위치에 비어 있다는 뜻의 "void"를 씀
| int main(void) { 코드 작성 return 0; } |
리턴형 함수이름(매개변수 리스트) { // 함수의 시작 코드 작성 0을 리턴함. 문장 끝에는 “ ;”을 씀 } // 함수의 끝 |
기본 자료형의 종류 : 문자형
문자 하나를 저장하기 위한 형
1바이트의 메모리가 할당
| 자료형 | 크기 (바이트) | 부호 | 입출력형식 | 표현 범위 |
| char | 1 | O | %c | -128 ∼ +127 |
| unsigned char | 1 | X | %c | 0 ∼ 255 |
기본 자료형의 종류 : 정수형
약 -21억(정확하게는 -2 31 : -2,147,483,648)에서 21억(정확하게는 2 31-1: 2,147,483,647)까지 또는 0에서 약 42억(정확하게는 2 32 -1 : 4,294,967,295)까지의 소수점이 없는 정수를 저장하기 위한 형
| 자료형 | 크기 | 부호 | 입출력형식 | 표현 범위 |
| short | 2 | O | %d | -32768 ∼ 32767 |
| unsigned short | 2 | X | %u | 0 ∼ 65535 |
| int | 4 | O | %d | -2147483648 ∼ 2147483647 |
| unsigned int | 4 | X | %u | 0 ∼ 4294967295 |
| long | 4 | O | %ld | -2147483648 ∼ 2147483647 |
| unsigned long | 4 | X | %lu | 0 ∼ 4294967295 |
기본 자료형의 종류 : 실수형
실수형(부동형, floating type)의 크기와 종류
| 자료형 | 크기 | 입출력 형식 | 표현 범위 | 정밀도 (precision) |
| float | 4 | %f | 1.175494351x10^-38 ∼ 3.402823466x10^38 |
6자리 |
| double | 8 | %lf | 2.2250738585072014x10^-308 ∼ 1.7976931348623158x10^308 |
15자리 |
| long double | 8 이상 | %lf | - | - |
식별자/리터럴/자료형/변수
식별자와 명명 규칙
- 변수, 함수 등에 부여하는 이름
- 식별자는 영문자(A∼Z, a∼z), 숫자(0∼9), 밑줄(_)만 가능
- 한글이나 밑줄(_)을 제외한 특수 문자, int, char 등 컴파일러에 의해 미리 의미가 정해져 있는 단어인 예약어(keyword)는 불가능
- 첫 글자는 반드시 영문자 또는 밑줄로 시작
리터럴(literal)
- 값 자체
- 문자는 양쪽에 작은 따옴표(예를 들어 'a')
- 문자열은 양쪽에 큰 따옴표(예를 들어 "soft", "한")
- 숫자는 그냥 씀
자료형(data type)
- 자료형은 처리, 저장하고자 하는 자료의 형태를 나타낸다.
- 기본 자료형에는 문자형, 정수형, 실수형, 열거형이 있다.
- 문자형(char, 1바이트), 정수형(int, 4바이트), 실수형(double, 8바이트)
변수
- 변수는 프로그램이 실행되는 동안 가변적인 자료를 저장하기 위한 기억장소의 이름으로 모든 변수는 사용하기 전에 반드시 선언을 해야 한다.
- int x;
- x = 10;
자동 형 변환
10/4, 10.0/4, 10/4.0, 10.0/4.0
자료형이 서로 다른 혼합 연산에서는 기억 장소의 크기가 큰 쪽으로 통일시켜 연산이 이루어짐
- 이것을 자동 형 변환(implicit arithmetic conversions)이라 함
- char(1바이트)형과 int(4바이트)형이 혼합 연산을 하게 되면 char형이 int형으로 변경되어 연산이 되고 결과도 int형으로 나옴
- int형(4바이트)과 double형(8바이트)의 혼합 연산에서는 int형이 double형으로 변경되어 연산이 되고 결과도 double형으로 나옴
- char → unsigned char → int → unsigned int → long → unsigned long → float → double
변수와 배열, 구조체
변수
- 단독주택
- int x; //4byte짜리 단독주택 1가구
배열
- 같은 평수로 구성된 아파트
- int x[5]; //4byte짜리 5가구
- 동일한 형(type)의 데이타들을 하나의 단위로 취급
구조체(변수/배열/구조체들의 모임)
- 다른 형(type)의 데이타들을 하나의 단위로 취급
struct Man{
char n;
int age;
double weight;
};
struct Man형 구조체를 선언하고 변수를 만들어서 멤버에 접근
#include <stdio.h>
struct Man{ //구조체 선언
int age; //멤버
double weight; //멤버
};
int main(void)
{
struct Man han; //struct Man 구조체형 변수 han선언
han.age=20; //구조체 변수의 멤버 age에 접근(점사용)
printf("%d\n",han.age);
return 0;
}
구조체 변수의 초기화와 멤버 값 대입
#include <stdio.h>
struct score { //struct score형, score형이 아님!
char hakbun[10];
char name[10];
int kor, eng, tot;
double ave;
};
int main(void)
{
struct score h = { "2020001","han",80,89 }; //초기화
h.tot = h.kor + h.eng;
h.ave = h.tot / 2.0;
printf("%s %s %d %d %d %f\n", h.hakbun, h.name,
h.kor, h.eng, h.tot, h.ave);
return 0;
}


구조체 변수들의 대입 연산
#include <stdio.h>
struct score {
char hakbun[10];
char name[10];
int kor, eng, tot;
double ave;
};
int main(void)
{
struct score j, h = { "202345678","han",80,89 };
h.tot = h.kor + h.eng;
j = h;
printf("%s %s %d %d %d\n", h.hakbun, h.name, h.kor, h.eng, h.tot);
printf("%s %s %d %d %d\n", j.hakbun, j.name, j.kor, j.eng, j.tot);
return 0;
}
h를 j에 대입하면 h의 모든 멤버가 j에 복사된다.


구조체를 활용한 성적처리 프로그램
